2017-01-12 28 views
0

我想開發一個簡單的文件上傳處理程序。NodeJS - 服務器端文件上傳處理程序

我唯一想要的是,這個應用程序從客戶端接收文件並保存在硬盤上。

(我不想與上傳一個的NodeJS文件,我只是想獲得一個文件上傳後,並將其保存在我的硬盤)

我怎麼能做到這一點?

我試過這種方式,但它不能按預期工作。

var http = require('http'), 
 
    path = require('path'), 
 
    os = require('os'), 
 
    fs = require('fs'); 
 

 
var Busboy = require('busboy'); 
 

 
http.createServer(function(req, res) { 
 
    if (req.method === 'POST') { 
 
\t \t 
 
\t try{ 
 

 
    var busboy = new Busboy({ headers: req.headers }); 
 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
 
\t \t 
 
\t \t var fstream = fs.createWriteStream('asdasd'); 
 
     file.pipe(fstream); 
 
     fstream.on('close', function() { 
 
\t \t \t res.writeHead(200, { 'Connection': 'close' }); 
 
      res.send('upload succeeded!'); 
 
     }); 
 
\t \t 
 
     /*var saveTo = path.join(os.tmpDir(), path.basename(fieldname)); 
 
     file.pipe(fs.createWriteStream('./output.asdasd')); 
 
\t fstream.*/ 
 
    }); 
 
    busboy.on('finish', function() { 
 
     res.writeHead(200, { 'Connection': 'close' }); 
 
     res.end("That's all folks!"); 
 
    }); 
 
    return req.pipe(busboy); 
 
\t } 
 
\t catch(err){ 
 
\t \t console.log('error : ' + err); 
 
\t \t res.writeHead(404); 
 
\t \t res.end(); 
 
\t } 
 
    } 
 
    res.writeHead(404); 
 
    res.end(); 
 
}).listen(4842, function() { 
 
    console.log('Listening for requests'); 
 
});

+0

如果你的問題是由別人的答案解決,請標明這個問題的答案正確。如果您自己想出了這個答案,請在答案部分(不是問題的一部分)將答案寫下來,並將其標記爲正確。 –

+0

此外,我們不使用[解決]標題攻擊 - 使用驗收系統。歡迎您接受您自己的答案,但如果其他人爲您提供了很大的幫助,那麼接受他們的答案是一個很好的舉動。 – halfer

回答

0

解決,

我與郵差試了一下,我改變了主意,並與RESTClient實現試了一下,現在它工作順利:)

0

只需使用FS API從節點上寫上文件接收到的數據? :)

https://nodejs.org/api/fs.html#fs_class_fs_writestream

+0

好主意,我在busboy.on('file')方法上試過這個,但是busboy.on('file')方法沒有被解僱,有任何想法:( –

+0

你確定你發送多部分類型嗎? – Mech45

+0

是的,它是.im測試它與rar和mp4文件 –

1

我從來沒有使用busboy之前,但在他們的GitHub documentation給出了例子正常工作。

let http = require('http'), 
    path = require('path'), 
    os = require('os'), 
    fs = require('fs'); 

let Busboy = require('busboy'); 

http.createServer(function (req, res) { 

    if (req.method === 'POST') { 

    let busboy = new Busboy({ headers: req.headers }); 

    // handle all incoming `file` events, which are thrown when a FILE field is encountered 
    // in multipart request 
    busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 

     // figure out where you want to save the file on disk 
     // this can be any path really 
     let saveTo = path.join(os.tmpdir(), path.basename(filename)); 

     // output where the file is being saved to make sure it's being uploaded 
     console.log(`Saving file at ${saveTo}`); 

     // write the actual file to disk 
     file.pipe(fs.createWriteStream(saveTo)); 
    }); 

    busboy.on('finish', function() { 

     res.writeHead(200, { 'Connection': 'close' }); 
     res.end("That's all folks!"); 
    }); 

    return req.pipe(busboy); 
    } 

    res.writeHead(404); 
    res.end(); 

}).listen(8000, function() { 
    console.log('Listening for requests'); 
}); 

我在相關部分添加了一些評論,以使它更清楚它的工作原理。如果你需要更多的細節,只需在下面評論,我會添加它們。

+0

謝謝Uzair :)一切都很好,但我不能保存與file.pipe(fs.createWriteStream('my.file'))方法,我做錯了什麼? –

+0

確保您嘗試寫入的路徑可由您的節點進程寫入。你可以使用'./my.file'使它成爲相對的,但安全的方法是使用Current Working Directory並使用'path'來加入它。例如:'path.join(process.cwd(),'my.file')'。這確保了每個操作系統上的路徑都是正確的。第二次檢查是看看我在'file.pip()'行之前添加的'console.log'是否被觸發。 –

+0

@ developer.alp此外,請確保您首先使用小於500kb的小文件對其進行測試,以確定代碼是否正常工作。較大的文件通常會導致與這段代碼無關的問題。 –

相關問題