本人node初學者,此前使用原生node實現文件上傳時遇到了一些困難,只作到了.txt
和.png
兩中格式的文件能夠正常上傳,若是上傳其餘格式文件服務端保存的文件會沒法正常打開,緣由是對form表單傳來的數據處理不完全。後來查找許多資料瞭解到了formidable
這個第三方模塊,可經過如下指令安裝:html
npm i formidable
官方對它的描述:前端
A Node.js module for parsing form data, especially file uploads.
一個專門用來處理表單數據尤爲是文件上傳的Node.js模塊。node
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>上傳文件</title> </head> <body> <form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="up_file" id="upload"> <input type="submit" id="submit" name="submit"> </form> </body> </html>
這裏須要把form的enctype
設置爲multipart/form-data
。
MND對此的描述:npm
multipart/form-data:當表單包含 type=file 的
<input>
元素時使用此值。瀏覽器
const http = require("http"); const fs = require("fs"); const formidable = require("formidable"); let server = http.createServer((req,res)=>{ if(req.url = "/upload"){ switch(req.method){ case "GET": //使用流來加載upload.html fs.createReadStream("./upload.html").pipe(res); break; case "POST": dealUpload(req,res); break; default: console.log("other method..."); break; } }else{ res.writeHead(302,{"Location": "upload"}); res.end(); } }) //監聽8080端口 server.listen(8080); console.log("listening on 8080, http://127.0.0.1:8080");
formidable
處理表單數據,並對生成的新文件重命名。function dealUpload(req,res){ var form = formidable.IncomingForm(); //保持原有擴展名 form.keepExtensions = true; //設置上傳目錄 form.uploadDir = __dirname + "/files/"; form.parse(req,function(err,fields,files){ if(err) throw err; console.log(fields); let oldFilename = files.up_file.name; //重命名上傳的文件 fs.rename(files.up_file.path, form.uploadDir + generateFilename(oldFilename),err=>{ if(err) { console.log("重命名失敗"); console.log(err); }else{ console.log("重命名成功!"); } }) res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"}); res.write('<meta charset="UTF-8" />'); res.end("<h1>上傳結束</h1>"); }) } function generateFilename(oldFilename){ //將老的文件名拼上時間戳,這樣既不會命名衝突又能夠看出文件的上傳事件 let d = new Date(); let names = oldFilename.split("."); return `${names[0]}_${""+d.getFullYear() + (d.getMonth()+1) + d.getDate() +'_'+ d.getHours() + d.getMinutes() + d.getSeconds()}.${names[1]}`; }
使用node main.js
指令將程序運行起來,而後在瀏覽器輸入http://127.0.0.1:8080
能夠看到:
選擇一個文件後點擊提交:
ui
而後便可在以前設置保存目錄下看到已保存且重命名的文件:
url
若有錯誤歡迎指正code