资讯专栏INFORMATION COLUMN

node.js实现formdata上传文件

Aceyclee / 3820人阅读

摘要:对象包含表单的文本域信息,或对象包含对象表单上传的文件信息。是文件的信息前端传递的文件类型在中获取将具有文本域数据,如果存在的话。

node.js实现formdata上传文件 1.关于formdata
XMLHttpRequest Level 2 添加了一个新的接口——FormData。利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 XMLHttpRequest 的 send() 方法来异步的提交表单。与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件。
FormData的api
方法一:

创建一个空FormData对象:
var formData = new FormData()
使用FormData.append添加一个键/值对:
formData.append("username", "Chris");

方法二:利用form表单传递给formdata
var myForm = document.getElementById("myForm");
formData = new FormData(myForm);
2.formdata上传文件
目录结构
.
├── index.js
├── node_modules
├── package.json
└── public
    ├── index.html
    └── uploads
客户端代码
服务端代码

</>code

  1. // index.js
  2. var express = require("express");
  3. var app = express();
  4. /*
  5. 1. 保存在文件夹中的文件为二进制,所以想在本地点开能预览的,取消下面fs模块引用的注释
  6. 2. 并在命令行中输入 npm install fs --save
  7. */
  8. // var fs = require("fs");
  9. var multer = require("multer");
  10. // 这里dest对应的值是你要将上传的文件存的文件夹
  11. var upload = multer({dest:"./public/uploads"});
  12. app.use(express.static("./public"));
  13. app.post("/upload", upload.single("file"),(req, res) => {
  14. // req.file 是 "file" 文件的信息 (前端传递的文件类型在req.file中获取)
  15. // req.body 将具有文本域数据,如果存在的话 。(上面前端代码中传递的date字段在req.body中获取)
  16. console.log(req.body) //{ date: "2018/1/20 下午5:25:56" }
  17. // ---------- 因为保存的文件为二进制,取消下面代码块注释可让保存的图片文件在本地文件夹中预览 ------
  18. /*
  19. var file_type;
  20. if (req.file.mimetype.split("/")[0] == "image") file_type = "." + req.file.mimetype.split("/")[1];
  21. if (file_type) {
  22. fs.rename(req.file.path, req.file.path + file_type, function (err, doc) {
  23. if (err) {
  24. console.error(err);
  25. return;
  26. }
  27. console.log("55");
  28. res.send("./uploads/" + req.file.filename + file_type)
  29. })
  30. return;
  31. }
  32. */
  33. // ---------------------
  34. res.send("./uploads/" + req.file.filename)
  35. })
  36. app.listen(9999);
接下来解释下上述代码

</>code

  1. 上面的例子是上传图片,服务端传回图片路径进行展示。上传其他文件同理!

index.js中依赖express、multer 可以通过npm install express multer --save进行安装,当然你也可以不使用express。
接下去重点讲述下multer:
1.安装:
npm install --save multer
2.使用:
multer(opts)

</>code

  1. Multer 接受一个 options 对象,其中最基本的是 dest 属性,这将告诉 Multer 将上传文件保存在哪。如果你省略 options 对象,这些文件将保存在内存中,永远不会写入磁盘。通常,只需要设置 dest 属性 像这样:
    var upload = multer({ dest: "uploads/" }) // dest对应的值就是你想文件存储的文件夹

.single(fieldname)

</>code

  1. 接受一个以 fieldname 命名的文件。这个文件的信息保存在 req.file。(这里的fieldname指的是formdata.append("file",文件)中的"file"字段。
    其他方法详见multer文档。

Multer 会添加一个 body 对象 以及 filefiles 对象 到 express 的 request 对象中。body 对象包含表单的文本域信息,filefiles 对象包含对象表单上传的文件信息。

</>code

  1. app.post("/upload", upload.single("file"),(req, res) => {
  2. // req.file 是 "file" 文件的信息 (前端传递的文件类型在req.file中获取)
  3. // req.body 将具有文本域数据,如果存在的话 。(上面前端代码中传递的date字段在req.body中获取)
  4. console.log(req.body) // { date: "2018/1/20 下午5:25:56" }
  5. res.send("./uploads/"+req.file.filename)
  6. })
注意事项:

一、formdata在控制台打印为空

</>code

  1. 可通过下面方法获取:

</>code

  1. var formData = new FormData();
  2. formData.append("username", "Chris");
  3. formData.append("username", "Bob");
  4. // get()函数只会返回username附加的第一个值
  5. formData.get("username"); // Returns "Chris"
  6. // getAll()函数将返回username一个数组中的两个值:
  7. formData.getAll("username"); // Returns ["Chris", "Bob"]

更多formdata方法

二、如果formdata添加文件成功了的话,还是上传失败,可以看看头部是否为multipart/form-data

</>code

  1. 文章都是学习过程中的总结,如果发现错误,欢迎留言指出

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

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

相关文章

  • H5拖放+FormData接口+NodeJS,完整异步文件上传(一)

    摘要:前段时间面试过程中,频繁遇到异步文件上传的相关问题。所以,这会是一个拖放接口实现文件异步上传的完整。监听放置元素的事件,通过对象可以获得拖拽事件的状态及数据。后端文件接收保存后端使用实现文件上传。   前段时间面试过程中,频繁遇到H5异步文件上传的相关问题。还遇到过一个通过H5拖放功能实现文件异步上传的问题,大概知道H5有新增拖拽功能可以接收文件,如何异步上传文件就母鸡了(摊手)。面试...

    NervosNetwork 评论0 收藏0
  • 基于Vue + Node.js + MongoDB的图片上传组件,实现图片的预览和删除

    摘要:网址功能单图多图上传图片上传预览上传进度条分组上传,分组查询新建分组,删除分组删除图片选择图片目录结构前端利用搭建,中引入子组件。实现分组的新增查询删除。利用模块实现删除文件功能。 公司要写一些为自身业务量身定制的的组件,要基于Vue,写完后扩展了一下功能,选择写图片上传是因为自己之前一直对这个功能比较迷糊,所以这次好好了解了一下。演示在网址打开后的show.gif中。 使用技术:Vu...

    hzx 评论0 收藏0
  • 用现代化的方式开发一个图片上传工具

    摘要:对于图片上传,大家一定不陌生。项目地址一环境搭建本项目使用目前最新的和进行开发,所以环境的搭建必不可少。在目录下新建代码内容只有行,其输入为一个图片文件,输出为一串编码。同样的方式,我们可以为也设置一个代理数组,以实现向外抛出数组的目的。 对于图片上传,大家一定不陌生。最近工作中遇到了关于图片上传的内容,借此机会认真研究了一番,遂一发不可收拾,最后琢磨了一个东西出来。在开发的过程中有不...

    beanlam 评论0 收藏0

发表评论

0条评论

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