2012-09-19 14 views
6

estoy en express3.x y utilizando formidablenodejs formidables no desencadenar eventos

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 

y el formulario de carga es

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') 

ninguno de ocurren los eventos ... No está seguro de lo que soy Me falta ...

Respuesta

1

¿Hay alguna razón específica por la que esté utilizando formidable y no la construida en bodyParser? Utiliza el middleware multipart y se basa en formidable. Por lo tanto, la mayoría de las opciones de formidable también se pueden aplicar a bodyParser. Por ejemplo:

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

Para responder a su pregunta, pruebe el siguiente código:

app.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() 
}) 

index.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) 
    }) 

Tener un vistazo a la W3C Specifications para más eventos.

2

expreso es formidable usando internamente, por lo que su formidable no recibe ningún evento, si desea utilizar formidable en su propio usted tiene que quitar multipart/form-data del bodyParser

todavía estoy en 2.x expreso sino que también debe hacer el truco en 3.x, en su función de app.configure tratar

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

ahora puede utilizar formidable por su cuenta.

1

Tuve el mismo problema con el que el archivo se cargó completamente antes de que Mi controlador se acercara a procesarlo. Los eventos fueron despedidos pero aún no estaba escuchando. Para contrarrestar esto, escribí un middleware para capturar archivos cargados y mantenerlos para que el controlador los pueda acceder más tarde.

https://gist.github.com/3813103

se puede implementar con

var fileHandler = require('./middleware/fileHandler'); 
app.use(fileHandler()); 
3

si utiliza app.use(express.bodyParser()) es equivalente a:

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

puede quitar app.use(express.multipart()); a continuación, puede utilizar el objeto formidable.

Cuestiones relacionadas