2012-04-12 26 views
7

file tải lên với nút-đáng gờm trên Express là đơn giản như nàylàm mọi thứ với nhiều file khi tải chúng sử dụng nút-đáng gờm với Express

app.post('/upload', function(req, res) { 
    // do something with req.files 
}); 

Các tập tin đang lưu

Hình thức: (nhiều = "nhiều" là một tính năng HTML5 cho phép người dùng lựa chọn nhiều file để tải lên)

<form method="post" enctype="multipart/form-data" action="upload"> 
    <input type="text" name="title"/> 
    <input type="file" name="upload" multiple="multiple"/> 
    <input type="submit" value="upload" id="s3form_submit"/> 
</form> 

Nếu tôi thêm dòng này vào mã upload

console.log(req.files.upload.path); 

Khi tải lên một tệp, đường dẫn sẽ hiển thị trong bảng điều khiển. Nhưng khi tôi tải lên nhiều hơn một tập tin, nó chỉ nói không xác định trong giao diện điều khiển. Làm cách nào để tải nội dung nhật ký cho từng tệp? Sử dụng vòng lặp for?

Ví dụ về nút trên GitHub ghi lại mọi tệp khi bạn tải lên một số: https://github.com/felixge/node-formidable/blob/master/example/upload.js (Tôi đã thử sử dụng mã này trong Express, không hoạt động) Nó thực hiện chính xác những gì tôi muốn, nhưng làm cách nào để làm điều này trong một Ứng dụng Express?

Trả lời

8

Nó hoạt động bằng cách di chuyển dòng bên dưới xuống dưới cùng của hàm app.configure. Tìm hiểu về tầm quan trọng của trật tự liên quan đến trung cấp tốc ở đây: http://expressjs.com/guide.html#middleware

app.use(express.bodyParser({ uploadDir:__dirname + '/public/uploads' })); 

Và bằng cách sử dụng bộ xử lý này:

app.post('/upload', function(req, res){ 
    var form = new formidable.IncomingForm(), 
    files = [], 
    fields = []; 
    form.on('field', function(field, value) { 
     fields.push([field, value]); 
    }) 
    form.on('file', function(field, file) { 
     console.log(file.name); 
     files.push([field, file]); 
    }) 
    form.on('end', function() { 
     console.log('done'); 
     res.redirect('/forms'); 
    }); 
    form.parse(req); 
}); 

Cảm ơn Ryan!

1

Vì vậy, req.files có thể là một mảng. Hãy thử làm console.log(req.files) trong trình xử lý và xem nó trông như thế nào ... Nhưng tôi nghĩ bạn nên làm như trong ví dụ của họ. Bạn có thể làm cho nó hoạt động bằng cách chỉ cần xóa ../test/common yêu cầu ở trên cùng và thay đổi hằng số thành giá trị tĩnh (ví dụ thay vì TEST_TMP sử dụng __dirname + '/uploads').

Việc xử lý:

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

form.uploadDir = __dirname + '/uploads'; 

form 
    .on('field', function(field, value) { 
    console.log(field, value); 
    fields.push([field, value]); 
    }) 
    .on('file', function(field, file) { 
    console.log(field, file); 
    files.push([field, file]); 
    }) 
    .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); 

Các tập tin hiện đang trong __dirname + '/uploads' tên theo sản lượng trên giao diện điều khiển (và để phản ứng, như bạn thấy trong xử lý end).

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