node.js 通過ajax上傳圖片

來源:互聯網
上載者:User

node.js 通過ajax上傳圖片
這個階段,利用晚上剩餘的時間用node.js+mongdb+express+jade去實現自己的一個部落格網站,裡面的發表部落格中需要用到上傳圖片,嵌入到自己用textarea標籤實現的markdown編輯器中。這部分實現是利用了html5的formData函數去實現

html代碼(jade):

 
  1. form#uploadfile
  2. div.form-group
  3. input#inputfile(type="file" name="inputfile")
  4. p.help-block#upfiletip 只支援png和ipg格式的圖片上傳
  5. button.btn.btn-success(type="button" onclick="upFile()") 上傳
ajax代碼(javascript):

 
  1. //判斷圖片的格式是否是png/ipg的格式
  2. function judgePhotoExt(name){
  3. if(name.length === 0){
  4. $("#upfiletip").css("color","red");
  5. $("#upfiletip").text = "你沒有選擇任何圖片!!!"
  6. return false;
  7. }
  8. var extName = name.substring(name.lastIndexOf('.'),name.length).toLowerCase();
  9. if(extName != '.png' && extName != '.ipg'){
  10. $("#upfiletip").css("color","red");
  11. $("#upfiletip").text = "只支援png和ipg格式的格式的檔案!!!"
  12. return false;
  13. }
  14. return true;
  15. }

  16. //上傳圖片檔案
  17. function upFile(){
  18. var filename = $("#inputfile").val();
  19. if(judgePhotoExt(filename)){
  20. var data = new FormData();
  21.     var files = $("#inputfile")[0].files;
  22. if(files){
  23.       data.append("file", files[0]);
  24. }
  25. $.ajax({
  26. url: '/blog/photo/new',
  27. type: 'POST',
  28. data: data,
  29. async: false,
  30. cache: false,
  31. contentType: false,
  32. processData: false,
  33. success: function(data){
  34. var text = $("#content-textarea").val();
  35. text = text+"![圖片提示]("+data+")";
  36. $("#content-textarea").val(text);
  37. $('#imageModal').modal('hide');
  38. },
  39. error: function(err){
  40. console.log(err);
  41. }
  42. })
  43. }
  44. }
注意:其中一定要注意的點:processData的屬性要設定為false,這個是html5的屬性,如果沒有設定為false的話,這個地方會出問題。主要是檔案的內容不希望轉換成字串。具體可查看jquery ajax的參數解釋:http://www.w3school.com.cn/jquery/ajax_ajax.asp

對於FormData對象,你可以先建立一個空的FormData對象,然後使用append()方法向該對象裡添加欄位(引用別的網站的描述)
比如:

 
  1. var oMyForm = new FormData();

  2. oMyForm.append("username", "Groucho");
  3. oMyForm.append("accountnum", 123456); // 數字123456被立即轉換成字串"123456"

  4. // fileInputElement中已經包含了使用者所選擇的檔案
  5. oMyForm.append("userfile", fileInputElement.files[0]);

  6. var oFileBody = "<a id="a"><b id="b">hey!"; // Blob對象包含的檔案內容
  7. var oBlob = new Blob([oFileBody], { type: "text/xml"});

  8. oMyForm.append("webmasterfile", oBlob);

  9. var oReq = new XMLHttpRequest();
  10. oReq.open("POST", "http://foo.com/submitform.php");
  11. oReq.send(oMyForm);
這部分內容需要查看FormData對象的具體內容,可查看該網址:http://www.cnblogs.com/lhb25/p/html5-formdata-tutorials.html

node.js後台代碼如下:

 
  1. router.post('/photo/new',function(req,res,next){
  2. let form = new formidable.IncomingForm(); //建立上傳表單
  3. form.uploadDir = UPLOAD_PATH;
  4. form.keepExtensions = true; //保留尾碼
  5. form.maxFieldsSize = 4*1024*1024; //檔案大小
  6. form.parse(req,function(err,fields,files){
  7. if(err){
  8. res.send("插入標籤失敗");
  9. return;
  10. }
  11. let extName = '';
  12. let urls = [];
  13. for(var key in files){
  14. let file = files[key];
  15. switch(file.type){
  16. case 'image/pjpeg':
  17. extName = 'jpg';
  18. break;
  19. case 'image/jpeg':
  20. extName = 'jpg';
  21. break;
  22. case 'image/png':
  23. extName = 'png';
  24. case 'image/x-png':
  25. extName = 'png';
  26. break;
  27. }
  28. if(extName.length === 0){
  29. res.send("只支援png和jpg格式的圖片檔案");
  30. return;
  31. }
  32. let saveName = uuid.v1()+'.'+extName;
  33. let savePath = form.uploadDir+saveName;
  34. urls.push(PHOTO_URL+saveName);
  35. fs.renameSync(file.path,savePath);
  36. }
  37. res.send(urls[0]);
  38. })
  39. })

使用formidable庫輔助實現

其實裡面最重要的還是FormData的使用,用html5實現這部分的非同步上傳還是比較方便的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.