Valums file-uploader на nodejs - множественная загрузка файла
Я использую valums ajax file-uploader
Моя сторона узла nodejs выглядит следующим образом:
fileStream = fs.createWriteStream(__dirname+'/../public/images/houses/'+rndname);
req.pipe(fileStream);
req.on('end', function() {
body = '{"success":"true", "name": "'+rndname+'"}';
res.writeHead(200,
{ 'Content-Type':'text/plain'
, 'Content-Length':body.length
});
res.end(body);
});
клиентская сторона:
function createUploader(){
var uploader = new qq.FileUploader({
element: document.getElementById('homepic'),
action: '/server/upload',
allowedExtensions: ['jpg', 'png', 'gif'],
multiple:true,
onComplete: function(id, fileName, responseJSON){
$("#homepic").append("<img src='/images/houses/"+responseJSON.name+"' class='mediumpic' /> ");
}
});
}
window.onload = createUploader;
Это все работает для загрузки одного файла просто отлично!
Итак, представьте - я нажимаю кнопку загрузки, выбираю pic, он загружается очень быстро, появляется на экране.
Теперь я хочу загрузить еще один. Я выбираю pic, он быстро загружается на сервер (я вижу его на сервере), я возвращаю ответ нового имени файла и успеха, я помещаю картинку на экран с моим добавлением. Но картина не появляется. Я пытаюсь открыть в новой вкладке только рис и все еще ничего, даже если я вижу это на сервере, стоящем в правильном каталоге. После 3-5 минут ожидания он просто появляется, даже если не требуется обновление страницы. Что вызывает такое поведение? Это трубопровод, и мне нужно позвонить Марио, чтобы исправить это или что-то еще?:)
Ответы
Ответ 1
Изменен мой req.pipe для req.on('data'), и он начал работать. Как-то кажется, что мой req.pipe не закрыл соединение и "ожидал" большего количества данных, даже несмотря на то, что весь файл был загружен. Вот почему я не мог вызвать GET для записи, и он находился в состоянии ожидания.
Это устранило мои проблемы:
req.on('data', function(data) {
ws.write(data);
});
req.on('end', function(data) {
var body = '{"success":"true", "name": "'+rndname+'"}';
res.writeHead(200,
{ 'Content-Type':'text/plain'
, 'Content-Length':body.length
});
res.end(body);
});
Несмотря на то, что я нашел решение своей проблемы, если кто-нибудь знает, почему req.pipe не закрыл соединение и застрял в подвеске, как 2-3 минуты, пока не появилась фотография, сообщите мне.
Ответ 2
Я создал компонент промежуточного программного обеспечения Express 3.x, который позволяет вам загружать загруженные файлы valums/fineuploader через коллекцию req.files
.
Все, что вам нужно сделать, это добавить промежуточное ПО во время конфигурации Express, например:
var fineuploaderExpressMiddleware = require('fineuploader-express-middleware');
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(fineuploaderExpressMiddleware({ uploadDir: '/tmp ' }));
Компонент доступен здесь: https://github.com/suprememoocow/fineuploader-express-middleware