7

我在 express3.x 上并使用强大的

app.post "/up",(req,res)->
formidable = require('formidable')
form = new formidable.IncomingForm()
form.uploadDir = __dirname + "/uploads"
form.encoding = 'binary'


form.addListener 'file',(name,file) ->
    #write file
    console.log('file uploaded')
    return
console.log('$$$$$$$$$$$')
form.addListener 'end', ->
    console.log('end')
    res.end()
    return
console.log('@@@@@$$$$')
form.parse req,(err,fields,files)->
    console.log('parse')
    console.log(err) if(err)
    return
console.log('######')
return

上传表格是

block content
:coffeescript
    $ ->
        formData = new FormData()
        xhr = new XMLHttpRequest()
        onProgress = (e)->
            per_complete = (e.loaded/e.total) * 100 if e.lengthComputable

        onReady = (e)->
            alert("Ready")

        onError = (err)->
            alert("Error Loading "+err)

        $('#upload').click (e)->
            formData.append('img',document.getElementById('img').files[0])
            xhr.open('post','/up',true)
            xhr.addEventListener('error',onError,false)
            xhr.addEventListener('progress',onProgress,false)
            xhr.send(formData)
            xhr.addEventListener('readystatechange',onReady,false)

h1 hello world
form
    |select Image: 
    input(type='file',name='img', id='img')
    input(type='button',value='button', id='upload')

没有任何事件被触发......不确定我错过了什么......

4

6 回答 6

3

如果你使用app.use(express.bodyParser()) 相当于:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

你可以删除app.use(express.multipart());然后你可以使用强大的对象。

于 2013-09-29T09:15:38.893 回答
2

express 在内部使用了强大的功能,因此您的强大功能不会收到任何事件,如果您想自己使用强大的功能,则必须multipart/form-data从 bodyParser中删除

我还在 express 2.x 上,但在你的 app.configure 函数中,这也应该在 3.x 上解决问题

app.configure(function(){
  delete express.bodyParser.parse['multipart/form-data']
})

现在你可以自己使用强大的了。

于 2012-09-27T15:47:28.163 回答
1

我遇到了同样的问题,在我的控制器开始处理文件之前,文件已完全上传。事件被触发了,但我还没有在听。为了解决这个问题,我编写了一个中间件来捕获文件上传并保留它们以供控制器稍后访问。

https://gist.github.com/3813103

你可以用

var fileHandler = require('./middleware/fileHandler');
app.use(fileHandler());
于 2012-10-01T17:13:18.637 回答
1

您使用强大的而不是内置的bodyParser是否有特定原因?它使用多部分中间件并基于强大的。因此,强大的大多数选项也可以应用于 bodyParser。例如:

app.use(connect.multipart({ uploadDir: path }));

要回答您的问题,请尝试以下代码:

应用程序.js

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.post("/", function(req, res) {
  console.log(req.files.img)
  res.end()
})

索引.jade

form
  input(type="file", name="img", id="img")
  input(type="button", value="button", id="upload")
script
  var formdata = new FormData()
  var xhr = new XMLHttpRequest()

  $("#upload").on("click", function(e) {            
    xhr.upload.onprogress = function(evt) {
      console.log("While sending and loading data.")
      if (evt.lengthComputable) {
        console.log (evt.loaded / evt.total * 100);
      }
    }

    xhr.onloadend = function(evt) {
      console.log("When the request has completed (either in success or failure).")
    }

    xhr.onload = function(evt) {
      console.log("When the request has successfully completed.")
    }

    var image = document.getElementById('img').files[0]
    formdata.append("img", image)
    xhr.open("POST", "/", true)
    xhr.send(formdata)
  })

查看W3C 规范以了解更多活动。

于 2012-09-26T11:27:31.980 回答
1

Nodejs / 快速设置

// https://www.npmjs.com/package/express-formidable
npm install express-formidable

快速演示

const express = require('express');
const formidableMiddleware = require('express-formidable');

const app = express();

// Express-Formidable attaches your multi-part form to the request object
app.use('/formdata/with-fields-and-files', formidableMiddleware(), (req, res) => {
   console.log(req.fields, 'fields')
   console.log(req.files, 'files')
}

app.listen(3000)
于 2021-03-15T20:24:54.937 回答
0

今天也发生了类似的问题。
浪费了4个多小时的时间。
在这里期待答案,但在这里找不到,所以写下来。

问题

1. formidable - fileBegin event is     fired  
2. formidable - file      event is     fired - for small ~3MB/~4MB files
3. formidable - file      event is not fired - for large files

on local machine - nodejs/libraries will work fine
on remote machine - behind nginx it above issue happens

使用的库:
- 微型 - https://github.com/zeit/micro - 主要罪魁祸首,由于过于简单的编程模型
- 强大 - https://www.npmjs.com/package/formidable - 较小的罪魁祸首没有给出示例异步/等待

解决方案

1. increase the VM memory size 2/3 times the file upload size (libraries eat a lot of memory)
2. increase both proxy & http timeout/ size in the nginx to the required
    - example, 10 mins timeout & 2G size
3. change the programming model for large files
    a. on local machine - nodejs/libraries will work fine
    b. but behind the nginx proxy, it optimizes and kills the on going process asap
        to solve this proxy issue, use more promises/ async-awaits, delay the reply to nginx

希望有帮助。

于 2019-10-30T02:55:05.427 回答