资讯专栏INFORMATION COLUMN

nodejs express图片上传前后端配置讲解

tuniutech / 2060人阅读

摘要:默认地,表单数据会编码为。就是说,在发送到服务器之前,所有字符都会进行编码空格转换为加号,特殊符号转换为值。提交说明文件上传。图片选择图片地址上传上传。用表单直接构造对象就不需要下面的方法来为表单进行赋值了。

nodejs图片上传

nodejs一般开发网站基本都用express框架,本文也主要以express为例,讲解如何上传图片;
express本身没有上传图片功能;一般都是集成相应的模块;常用的有multer中间件和formidable中间件,前一个我配置的时候总是出错,所以pass;此处主要演示formidable的用法;

首先前端页面配置,无非两种,

-表单提交;
-ajax提交;
表单提交代码如下




    
    <span class="nginx"><span class="hljs-attribute">Document</span></span>


这里注意表单的enctype属性一定要是:multipart/form-data
别忘了name属性;
这是html文档的讲解:

定义和用法
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。

Alt text

ajax提交:

  1. <span class="hljs-attr">formdata</span> <span class="hljs-string">file jquery ajax upload</span>
  2. ajax 文件上传 。

  3. Ajax上传

ajax上传主要用的是Jquery;这一块只是知道这么用;配置ajax的时候processDatacontentType都设置为false;
还有此处用了HTML5的一个新特性;FormData;
用法如下:new FormData($("#myForm")[0]);

关于ajax这一块我做了个尝试,就是不用html5的FormData,而是直接用$("file_upload").val()去取文件表单的值,然后通过ajax传递,结果不是很理想;

将这坨数据传到后端就可以了;

前端页面演示完了;下面是后端代码演示:

</>code

  1. var express = require("express");
  2. var router = express.Router();
  3. var formidable = require("formidable"),
  4. fs = require("fs"),
  5. TITLE = "formidable上传示例",
  6. AVATAR_UPLOAD_FOLDER = "/avatar/",
  7. domain = "http://localhost:3000";
  8. /* 图片上传路由 */
  9. router.post("/uploader", function(req, res) {
  10. var form = new formidable.IncomingForm(); //创建上传表单
  11. form.encoding = "utf-8"; //设置编辑
  12. form.uploadDir = "public" + AVATAR_UPLOAD_FOLDER; //设置上传目录
  13. form.keepExtensions = true; //保留后缀
  14. form.maxFieldsSize = 2 * 1024 * 1024; //文件大小
  15. form.parse(req, function(err, fields, files) {
  16. if (err) {
  17. res.locals.error = err;
  18. res.render("index", { title: TITLE });
  19. return;
  20. }
  21. console.log(files);
  22. var extName = ""; //后缀名
  23. switch (files.fulAvatar.type) {
  24. case "image/pjpeg":
  25. extName = "jpg";
  26. break;
  27. case "image/jpeg":
  28. extName = "jpg";
  29. break;
  30. case "image/png":
  31. extName = "png";
  32. break;
  33. case "image/x-png":
  34. extName = "png";
  35. break;
  36. }
  37. if(extName.length == 0){
  38. res.locals.error = "只支持png和jpg格式图片";
  39. res.render("index", { title: TITLE });
  40. return;
  41. }
  42. var avatarName = Math.random() + "." + extName;
  43. //图片写入地址;
  44. var newPath = form.uploadDir + avatarName;
  45. //显示地址;
  46. var showUrl = domain + AVATAR_UPLOAD_FOLDER + avatarName;
  47. console.log("newPath",newPath);
  48. fs.renameSync(files.fulAvatar.path, newPath); //重命名
  49. res.json({
  50. "newPath":showUrl
  51. });
  52. });
  53. });
  54. module.exports = router;

图片传到后端其实就是一段2进制字符串,保存在内存中,需要用到fs模块读取后再写入到新的目录;打印files

</>code

  1. { fulAvatar:
  2. File {
  3. domain: null,
  4. _events: {},
  5. _eventsCount: 0,
  6. _maxListeners: undefined,
  7. size: 106836,
  8. path: "public/avatar/upload_d75420a381af12d19db01599fd2d0b73.jpeg",
  9. name: "line.jpeg",
  10. type: "image/jpeg",
  11. hash: null,
  12. lastModifiedDate: 2016-12-19T15:22:47.896Z,
  13. _writeStream:
  14. WriteStream {
  15. _writableState: [Object],
  16. writable: false,
  17. domain: null,
  18. _events: {},
  19. _eventsCount: 0,
  20. _maxListeners: undefined,
  21. path: "public/avatar/upload_d75420a381af12d19db01599fd2d0b73.jpeg",
  22. fd: null,
  23. flags: "w",
  24. mode: 438,
  25. start: undefined,
  26. autoClose: true,
  27. pos: undefined,
  28. bytesWritten: 106836,
  29. closed: true } } }

以上数据用fs模块读取path属性得到是就是一段2进制的字符串;

注:如果不配置express中间件,express是不能取到上传的文件的,这一块在路由回调函数的req上没有做处理。

以上的示例基本就完成一些基本功能了;
疑惑就是网上一些jquery插件上传图片利用ajax,他们的原来是声明呢 ?希望有人给解释下

找到一篇相似的文章:

</>code

  1. https://segmentfault.com/a/11...

补充:

</>code

  1. var formData = new FormData();
  2. var fileObj = document.getElementById("file_upload").files[0];
  3. formData.append("fulAvatar", fileObj);

</>code

  1. formData的两种用法一种是直接将表单dom直接塞进去,还有一种就是通过append填进去,但是这里要注意,填进去的是namedomfiles[0]属性;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79631.html

相关文章

  • 利用angular4和nodejs-express构建一个简单的网站(二)——设置跨域访问和安装基本

    摘要:后端程序配置因为是用自动生成的应用。允许进行跨域访问的方法,我们这里主要用到的是和两种方法。现在为止,先设置这些,后面还有具体路由的配置和认证等内容。所以,我一直用这个框架来构建网页样式。其中表的与表的设置为外键约束。 在上面一章中,我创建了前端的angular4框架程序和后端的nodejs-express框架程序,在这一章中,我准备对前后端程序进行一些简单的配置,然后将后台数据库创建...

    Jokcy 评论0 收藏0
  • NodeJs+Express+Mysql + Vuejs 项目实战 - 大纲

    摘要:多一个技能多一条出路,祝你在自学道路上越走越好,掌握自己的核心技能,不只是优秀,还要成为不可替代的人 NodeJs+Express+Mysql + Vuejs 项目实战 最近准备写一系列文章,全面讲述如何基于NodeJs + Express + Mysql + Vuejs 从零开发前后端完全分离项目; 文笔及技术可能在某些方面欠佳,请您指正,共同学习进步 前端:Vuejs全家桶 后端:...

    noONE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<