nodejs+multer+ajax文件上傳


前端 html代碼 + ajax代碼

  form表單(無需指定action)

<form enctype="multipart/form-data" method="post" class="upload-cont">
    <input type="file" name="files1" class="files1">
    <input type="text" name="username" class="username">
    <input type="button" class="uploadBtn" value="點擊上傳">
</form>

  使用jquery中的ajax的方式上傳文件

復制代碼
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
$(".files1").on("change",function(e){
     var e = e || window.event;
     var files = e.target.files;
     var file = files[0];
    //文件上傳
    $(".uploadBtn").off("click").on("click",function(){
         var username = $('.username').val();
         var formData = new FormData();
         formData.append('files1',file);
         formData.append('username',username);
         console.log(file);
         $.ajax({
              url: "/ajaxUpload",
              type: "post",
              data:formData,
              contentType: false,//使用multer配合ajax時無需配置multipart/form-data,multer將自動配置,手動配置將報錯,boundary not found
              processData: false,
              success: function(res){
                   console.log(res);
              },
              error:function(err){
                   console.log(err);
              }
       });
   })
})
</script>
復制代碼

FormData對象介紹

  https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects

  通過FormData對象可以組裝一組用 XMLHttpRequest發送請求的鍵/值對。它可以更靈活方便的發送表單數據,因為可以獨立於表單使用。

如果你把表單的編碼類型設置為multipart/form-data ,則通過FormData傳輸的數據格式和表單通過submit() 方法傳輸的數據格式相同。

所以使用formData的時候 只需要在form上設置enctype="multipart/form-data",然后用ajax跟formData提交form表單數據,可代替直接用form表單submit提交方式。 

multer介紹

  Multer 是一個 node.js 中間件,用於處理 multipart/form-data 類型的表單數據, 它主要用於上傳文件. 它是寫在 busboy 之上非常高效。

  注意: Multer 不會處理任何非 multipart/form-data 類型的表單數據.

  multer文檔地址:https://www.npmjs.com/package/multer
  引用地址:https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md

windows下 安裝 multer

  npm install --save multer

multer的使用

var multer = require('multer');
/**
 * process.cwd()獲取項目根目錄地址,可以將上傳的文件指定到靜態文件目錄下,然后再返回地址給前端頁面,如:
 * var uploadPath = process.cwd()+'/public/uploads' 前端訪問地址 http://localhost:3000/uploads/文件名
 **/
var uploadPath = process.cwd()+'/uploads';//直接存放在根目錄下uploads
var storage = multer.diskStorage({//multer存儲引擎  存儲引擎自定義引用 https://github.com/expressjs/multer/blob/master/StorageEngine.md
  destination: ,//指定上傳文件的路徑
  filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now())//命名上傳文件 } }) 
  var multer = multer({ 
      storage: storage,
   //limits:''//Limits of the uploaded data
}).single('files1');//single 單文件上傳,files1為form表單中 接受文件的name字段名稱
app.post('/ajaxUpload',function(req,res){ 
  multer(req,res,function(err){
    if(err){
      console.log(err);
      return ;
    }
    console.log(req.body.username);//獲取通過formData中表單的字段 name="username"的數據
    //req.body ajax提交的非文件數據
    //req.body.username //提交參數 username
    //req.file.fieldname 上傳文件 input file  name字段名稱
    //req.file.filename 上傳文件 文件名
    //req.file.originalname 上傳文件 文件名
    //req.file.mimetype 上傳文件類型
    //req.file.size 上傳文件大小
    //req.file.destination 上傳文件存在的路徑
    //req.file.path 上傳文件的 路徑
    console.log(req.file.path);
     /**

         * 可以通過req.file中的參數,做一個文件上傳的過濾,例如req.file.size 限制文件上傳大小,req.file.mimetype 限制文件上傳的類型

         **/

    res.send({msg:'上傳成功',img:req.file.path});//返回數據到前端頁面,可以將上傳的圖片,在前端預覽。
  })
});

  在使用 res.send() 發送數據到前端時,建議將圖片上傳的目錄存放在 public 靜態目錄下,靜態目錄設置在 app.js ,設置 app.use(express.static(path.join(__dirname, 'public')));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM