我正在開發一個涉及文件上傳的NodeJS項目。上傳與代碼在客戶端完成:NodeJS Web應用程序文件上傳文件開始
$('#file-upload').bind('change focus click', function() {
var file = jQuery(this)[0].files[0];
if (file && file.fileName) {
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', onProgressHandler, false);
xhr.upload.addEventListener('load', transferComplete, false);
xhr.open('POST', '/upload', true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('X-File-Name', encodeURIComponent(file.fileName));
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.send(file);
function onProgressHandler(evt) {
var percentage = event.loaded/event.total*100;
console.log(percentage);
}
function transferComplete(evt) {
console.log('Done');
}
}
});
和服務器端,我用:
app.post('/upload', function(req, res, next) {
if(req.xhr) {
console.log('Uploading...');
var fName = req.header('x-file-name');
var fSize = req.header('x-file-size');
var fType = req.header('x-file-type');
var ws = fs.createWriteStream('./'+fName)
req.on('data', function(data) {
console.log('DATA');
ws.write(data);
});
req.on('end', function() {
console.log('All Done!!!!');
});
}
});
此代碼不能單獨工作,但與其他地區結合我更大的項目,它似乎剁碎了大文件的開頭,並且忽略了所有小文件。如果我上傳一個小文件,那麼console.log('DATA')永遠不會觸發,它會爲大文件啓動,但不會啓動文件。我相信由於某種原因,它會提早發送文件,並且在我的函數剛剛發送時(或者在一個小文件的情況下,整個文件已經發送)。不過,我不知道會造成這種情況。
謝謝!
我也有這個問題。我通過保存文件解決了這個問題,然後處理了其他需要的操作,比如將元信息保存到表格等。 – Damodaran