node.js 檔案上傳 fs 寫入問題,請安心服用。
前言說明
本篇為練習實作 Node入門 發生的問題。
本魔法實習生花了一個晚上,
尋找為何 node.js 在 upload file 應用上會發生錯誤「cross-device」。
檔案上傳時,會存於 c: ... Local\Temp 暫存資料夾,
若指定實體存放路徑為別的磁碟槽時,會發生存取權限失效,
因此,本篇介紹調用 util,將檔案 clone 至別分區,在進行 unlink。
引用檔案
var util = require('util');
修改 renameSync
原本程式碼:
fs.renameSync(files.upload.path, "C:/tmp/test.png");
建立 ReadStream,來源請指定剛上傳的檔案。
var readStream = fs.createReadStream(files.upload.path);
建立 WriteStream,指定檔案寫入存放的路徑(預設位置為 createServer 所在位置)。
var writeSteam = fs.createWriteStream("/tmp/test.png");
最後利用剛剛引用的 util ,將檔案寫入並將 fs unlinkSync。
util.pump(readStream, writeSteam, function() {
fs.unlinkSync(files.upload.path);
});
完整程式碼
var fs = require("fs"),
formidable = require("formidable");
var util = require('util');
function upload(response, request) {
console.log("Request handler 'upload' was called.");
var form = new formidable.IncomingForm();
console.log("about to parse");
form.parse(request, function(error, fields, files) {
console.log("parsing done");
//fs.renameSync(files.upload.path, "C:/tmp/test.png");
var readStream = fs.createReadStream(files.upload.path);
var writeSteam = fs.createWriteStream("/tmp/test.png");
util.pump(readStream, writeSteam, function() {
fs.unlinkSync(files.upload.path);
});
response.writeHead(200, { "Content-Type": "text/html" });
response.write("received image:<br/>");
response.write("<img src='/show' />");
response.end();
});
}
參考資料
【已解决】Node.js中所用的fs.renameSync出错:Error: EXDEV, cross-device link not permitted
有勘誤之處,不吝指教。ob'_'ov