2012-09-19 26 views
6

Tôi đang trên express3.x và sử dụng đáng gờmnodejs đáng gờm không kích hoạt bất kỳ sự kiện

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 

và hình thức upload là

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

không ai trong số các sự kiện đang nhận được kích hoạt ... Không chắc những gì là Tôi bị mất tích ..

Trả lời

1

Có lý do cụ thể nào khiến bạn sử dụng ghê gớm và không được xây dựng trong bodyParser? Nó sử dụng phần mềm trung gian multipart và dựa trên ghê gớm. Do đó, hầu hết các tùy chọn từ formidable cũng có thể được áp dụng cho bodyParser. Ví dụ:

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

Để trả lời câu hỏi của bạn, hãy thử các mã sau:

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

Có một cái nhìn tại W3C Specifications cho nhiều sự kiện hơn.

2

nhanh là sử dụng đáng gờm trong nội bộ, vì vậy bạn đáng gờm không nhận được bất kỳ sự kiện, nếu bạn muốn sử dụng đáng gờm trên riêng của bạn, bạn phải gỡ bỏ multipart/form-data từ bodyParser

tôi vẫn đang trên 2.x nhanh nhưng cũng nên thực hiện mẹo trên 3.x, trong hàm app.configure của bạn hãy thử

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

bây giờ bạn có thể tự mình sử dụng ghê gớm.

1

Tôi đã gặp sự cố tương tự trong đó tệp được tải lên hoàn toàn trước khi Bộ điều khiển của tôi có arround để xử lý nó. Các sự kiện đã bị sa thải nhưng tôi vẫn chưa nghe. Để chống lại hành động này tôi đã viết một phần mềm trung gian để nắm bắt các tập tin tải lên và giữ chúng xung quanh cho bộ điều khiển để truy cập sau này.

https://gist.github.com/3813103

bạn có thể thực hiện nó với

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

nếu bạn sử dụng app.use(express.bodyParser()) tương đương với:

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

bạn có thể xóa app.use(express.multipart()); sau đó bạn có thể sử dụng đối tượng đáng gờm.

Các vấn đề liên quan