1

/upload にファイルを送信すると、端末からコードが form.parse(req... でブロックされていることがわかります... :

delete express.bodyParser.parse['multipart/form-data'];

ただし、これを行うと、解析が null であるため、コードがクラッシュします。

ファイルのアップロードを /upload でのみ、おそらく手ごわいものでのみ機能させる方法について、誰もが考えていますか?

ありがとう。

これは私のapp.jsです:

'use strict';

var express = require("express");
var async = require("async");
var http = require('http');
var url = require("url");
var qs = require("querystring");
var fs = require("fs");
var formidable = require("formidable");
var mime = require("mime");

var app = module.exports = express();

app.configure(function () {
  app.set("views", __dirname + "/views");
  app.set("view engine", "ejs");
  app.engine("html", ejs.renderFile);
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser("abc"));
  app.use(express.static(__dirname + "/static"));
  app.use(app.router);
  app.use(express.limit('5mb'));
});

app.post('/upload', storage.upload);

これは私のコードstorage.jsです:

'use strict';

var async = require('async');
var formidable = require('formidable');
var fs = require('fs');
var util = require('util');
var api = require('./common');

exports.upload = function (req, res) {

  console.log("I am here");

  var form = new formidable.IncomingForm(),
    files = [],
    fields = [];

  form.uploadDir = "./uploads";

  form
    .on('field', function (field, value) {
      console.log(field, value);
      fields.push([field, value]);
    })
    .on('error', function (err) {
      res.writeHead(200, {'content-type': 'text/plain'});
      res.end('error:\n\n'+util.inspect(err));
    })
    .on('file', function (field, file) {
      console.log(field, file);
      files.push([field, file]);
    })
    .on('aborted', function (err) {
      console.log("user aborted upload");
    })
    .on('end', function () {
      console.log('-> upload done');
      res.writeHead(200, {'content-type': 'text/plain'});
      res.write('received fields:\n\n '+util.inspect(fields));
      res.write('\n\n');
      res.end('received files:\n\n '+util.inspect(files));
    });
  form.parse(req);
};
4

2 に答える 2

4

恐ろしいものを使いたい場合は、 app.use(express.bodyParser()); を削除してください。& 追加app.use(express.json());app.use(express.urlencoded());

コネクト3.0

このソリューションは私にとってはうまくいきました。他の開発者にとっては役立つかもしれません。

于 2014-07-29T13:36:59.700 に答える
2

github の例を見たことがありますか: https://github.com/visionmedia/express/blob/master/examples/multipart/index.js

Express 3.x で実行するように変更しましたが、スムーズに動作するようです。

var express = require('express');
var fs = require('fs');
var app = express();
var format = require('util').format;


// bodyParser in connect 2.x uses node-formidable to parse 
// the multipart form data.
app.use(express.bodyParser())

app.get('/', function(req, res){
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Title: <input type="text" name="title" /></p>'
    + '<p>Image: <input type="file" name="image" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
});

app.post('/', function(req, res, next){
  // the uploaded file can be found as `req.files.image` and the
  // title field as `req.body.title`
  res.send(format('\nuploaded %s (%d Kb) to %s as %s'
    , req.files.image.name
    , req.files.image.size / 1024 | 0 
    , req.files.image.path
    , req.body.title));
});

if (!module.parent) {
  app.listen(3000);
  console.log('Express started on port 3000');
}
于 2013-02-06T15:04:23.510 に答える