NodeJS+formidable實現文件上傳加自動重命名

前述

本人node初學者,此前使用原生node實現文件上傳時遇到了一些困難,只作到了.txt.png兩中格式的文件能夠正常上傳,若是上傳其餘格式文件服務端保存的文件會沒法正常打開,緣由是對form表單傳來的數據處理不完全。後來查找許多資料瞭解到了formidable這個第三方模塊,可經過如下指令安裝:html

npm i formidable

官方對它的描述:前端

A Node.js module for parsing form data, especially file uploads.
一個專門用來處理表單數據尤爲是文件上傳的Node.js模塊。node

實現過程

  1. 首先新建一個html文件做爲前端,因爲這裏只講功能全部沒有添加任何樣式。
<!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> 元素時使用此值。瀏覽器

  1. 新建main.js,用node的http模塊開啓http服務。
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");
  1. 使用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

相關文章
相關標籤/搜索