使用 HTML 将文件上传到 Node.js

Upload file to Node.js with HTML

我正在尝试制作一个 API 以使用 Node.js 服务器上传文件。我收到 undefined 回复。

我正在学习本教程https://www.youtube.com/watch?v=UtfZ-5WKpro

Node.js:

var express = require('express');

var app = express();
var bodyParser = require('body-parser');

app.use(bodyParser.json());

app.post("*", function(req, res) {
  res.end(JSON.stringify(req.files) + "\n");
});

console.log("Server at 8080");
app.listen(8080);

HTML

<html>
  <head>
    <form method="post"
          enctype="multipart/form-data"
          action="http://localhost:8080">
      <input type="file" name="myimage" />
      <input type="submit" name="submit" value="submit"/>
    </form>
  </head>
</html>

点击提交后我得到了 undefined 回复。

bodyParser.json()

… 所以你已经为 JSON 格式的请求设置了一个解析器

 enctype="multipart/form-data"

…但您没有发出 JSON 格式的请求。

the documentation for body-parser:

This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:

…后面是建议列表。

选择一个可以处理多部分请求的模块并使用它来代替您当前的选择。

我建议您使用 this module 来处理 Node/Express 中的文件上传。

var fileupload = require('fileupload').createFileUpload('/uploadDir').middleware;

app.post('/upload', fileupload, function(req, res) {
  // files are now in the req.body object along with other form fields
  // files also get moved to the uploadDir specified
});

另一种上传文件的方法可能是使用类似这样的东西

玉模板

form.data(action='/user/register', method='post', class="long-fields", enctype='multipart/form-data')
  input(type="text" name="name")
  input(name='fileLogo', type='file')
  input(type="submit" value="Register")

控制器

formidable = require('formidable'); //file upload handling via form
uuid = require('node-uuid'); //Unique ID
path = require('path'); //Path compiler
fs = require('fs'); //FileSystem

var form = new formidable.IncomingForm();
form.keepExtensions = false;
form.maxFieldsSize = 2 * 1024 * 1024; //2mb

form.parse(req, function(err, fields, files) {

  console.log(fields);
  console.log(files);

  fs.readFile(files.fileLogo.path, function (err, data) {
    var pathNew = __dirname + '/../../uploads/' + uuid.v1() + path.extname(files.fileLogo.name);

    fs.writeFile(pathNew, data, function (err) {
      console.log('uploaded', pathNew);
    });
  });

  res.send(jade.renderFile(settings.pathLess + prefix + '/register.jade', {
    req: req
  }));

});