1. 程式人生 > >nodejs 上傳檔案

nodejs 上傳檔案

1、html程式碼


<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <script src="../../public/js/jquery.min.js"></script>
    <script src="../../public/js/hb_common.js"></script>
    <link rel="stylesheet" href="../../public/css/bootstrap.min.css">
    <link rel="stylesheet" href="../../public/css/hb_wap.css">
    <title>nodejs上傳檔案測試</title>
</head>
<body >


<form action="upload" method="post" enctype ="multipart/form-data">
    <input type="file" name="myfile" />
    <button><%=btn_name%></button>
</form>

</body>
</html>

效果圖



2、控制器

檔案上傳使用的是“multiparty”模組,需要使用npm引入multiparty模組

npm install multiparty –-save-dev


var express = require('express');
var router = express.Router();
var fs = require('fs');
//"path"模組提供了生成上傳檔案塊的檔名的方法。
var path = require('path');

var util = require('util');
//使用multiparty模組,也是必須要使用"multipart/form-data"型別
var multiparty = require('multiparty');

/**
 * sqh 模組index
 * */
router.get('/', function(req, res, next) {
  //res.render('sqh/addGoods', { name: 'Express 路由1' });
  //res.writeHead(200, { "Content-Type": "text/plain" });
  //res.end("Welcome to the about!\n");
  res.render("sqh/index",{
    btn_name:"測試submit提交到指定的action"
  });
});


/**
 * 新增商品
 * */
router.get('/addGoods', function(req, res, next) {
  res.render('sqh/addGoods', { name: 'Express 路由1' });
});


/**
 * 新增商品
 * */
router.post('/upload', function(req, res, next) {

  // 解析一個檔案上傳
  var form = new multiparty.Form();
  //設定編輯
  form.encoding = 'utf-8';
  //設定檔案儲存路徑
  form.uploadDir = "uploadfile";
  //設定單檔案大小限制
  form.maxFilesSize = 20 * 1024 * 1024;
  //form.maxFields = 1000;  設定所以檔案的大小總和
  form.parse(req, function(err, fields, files) {
    var originalFilename = files.myfile[0].originalFilename;
    var path = files.myfile[0].path;

    console.log(originalFilename);
    console.log(path);
    //同步重新命名檔名
    fs.renameSync(path, originalFilename);

    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received upload:\n\n');
    res.end(util.inspect({fields: fields, files: files}));
  });

});

module.exports = router;


3、啟動web應用app.js


var express = require("express");
var http = require("http");
var app = express();

////////////////////// 獲取post過來的資料 /////////////////////////////
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));

////////////////////// 設定模板 /////////////////////////////
var ejs = require("ejs");
//使用set方法,為系統變數“views”和“view engine”指定值。
app.set("views", __dirname + "/views");
// 指定模板檔案的字尾名為html
app.set('view engine', 'html');
// 執行hbs模組
app.engine('html', ejs.__express);

////////////////////// 利用檔案來拆分路由的規模 /////////////////////////////
var router = express.Router();
var sqhIndex =  require('./routes/sqh/sqhIndex');


//設定web工程的根目錄
app.use(express.static(__dirname + '/'));
app.use('/sqh', sqhIndex);

http.createServer(app).listen(3000);


目錄結構圖