2012-09-19 17 views
6

jestem na express3.x i korzystania groźnynodejs groźnymi nie wywołując żadnych wydarzeń

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 

i forma wysyłania jest

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

żaden zdarzeń wyzwalane są coraz ... Nie jestem pewien, co I my missing ..

Odpowiedz

1

Czy istnieje szczególny powód, dla którego używasz budzący grozę, a nie wbudowany bodyParser? Używa oprogramowania pośredniego multipart i opiera się na potężnym. Dlatego większość opcji od formidable można również zastosować do bodyParser. Na przykład:

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

Aby odpowiedzieć na to pytanie, należy spróbować następujący kod:

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

Wystarczy popatrzeć na W3C Specifications więcej wydarzeń.

2

express używa wewnętrznie groźny, więc groźny nie dostać żadnych zdarzeń, jeśli chcesz używać groźny na własną rękę trzeba usunąć multipart/form-data z bodyParser

jestem nadal na wyraźną 2.x ale że należy również wykonać trick na 3.x, w swojej funkcji app.configure spróbować

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

teraz można używać groźny na własną rękę.

1

Miałem ten sam problem, w którym plik został przesłany kompletnie, zanim Mój kontroler dostał się do przetworzenia. Wydarzenia zostały wystrzelone, ale jeszcze nie słuchałem. Aby temu przeciwdziałać, napisałem oprogramowanie pośredniczące, aby przechwytywać przesłane pliki i zachować je, aby kontroler mógł uzyskać dostęp do nich później.

https://gist.github.com/3813103

można wdrożyć go

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

jeśli używasz app.use(express.bodyParser()) odpowiada:

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

można usunąć app.use(express.multipart()); następnie można użyć potężnego obiektu.

Powiązane problemy