博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js实现formdata上传文件
阅读量:5990 次
发布时间:2019-06-20

本文共 3204 字,大约阅读时间需要 10 分钟。

node.js实现formdata上传文件

1.关于formdata

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

创建一个空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
客户端代码
服务端代码
// index.jsvar express = require("express");var app = express();/*    1. 保存在文件夹中的文件为二进制,所以想在本地点开能预览的,取消下面fs模块引用的注释    2. 并在命令行中输入 npm install fs --save*/// var fs = require("fs");var multer = require("multer");// 这里dest对应的值是你要将上传的文件存的文件夹var upload = multer({dest:'./public/uploads'});app.use(express.static('./public'));app.post("/upload", upload.single('file'),(req, res) => {        // req.file 是 'file' 文件的信息 (前端传递的文件类型在req.file中获取)    // req.body 将具有文本域数据,如果存在的话  。(上面前端代码中传递的date字段在req.body中获取)    console.log(req.body) //{ date: '2018/1/20 下午5:25:56' }    // ---------- 因为保存的文件为二进制,取消下面代码块注释可让保存的图片文件在本地文件夹中预览 ------    /*    var file_type;    if (req.file.mimetype.split('/')[0] == 'image') file_type = '.' + req.file.mimetype.split('/')[1];    if (file_type) {        fs.rename(req.file.path, req.file.path + file_type, function (err, doc) {            if (err) {                console.error(err);                return;            }            console.log('55');            res.send('./uploads/' + req.file.filename + file_type)        })        return;    }    */    // ---------------------        res.send('./uploads/' + req.file.filename)})app.listen(9999);
接下来解释下上述代码
上面的例子是上传图片,服务端传回图片路径进行展示。上传其他文件同理!

index.js中依赖express、multer 可以通过npm install express multer --save进行安装,当然你也可以不使用express。

接下去重点讲述下multer:
1.安装:
npm install --save multer
2.使用:
multer(opts)

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

.single(fieldname)

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

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

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

注意事项:

一、formdata在控制台打印为空

clipboard.png

可通过下面方法获取:
var formData = new FormData();formData.append('username', 'Chris');formData.append('username', 'Bob');// get()函数只会返回username附加的第一个值formData.get('username'); // Returns "Chris"// getAll()函数将返回username一个数组中的两个值:formData.getAll('username'); // Returns ["Chris", "Bob"]

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

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

转载地址:http://uvnlx.baihongyu.com/

你可能感兴趣的文章
Windows bat脚本的for语句
查看>>
单片mongoDB
查看>>
LNMP-源码 PHP7
查看>>
简单干净的C#方法设计案例:SFCUI.AjaxValue()之三
查看>>
敏捷开发免费管理工具——火星人预览之五:常见问题问答
查看>>
敏捷开发一千零一问系列之十四:敏捷开发加班吗?
查看>>
文档:Windows Server 2012群集-移动虚拟机存储至共享
查看>>
sendmail
查看>>
软件构建、测试和部署自动化
查看>>
”计算机操作系统“学习笔记2
查看>>
VMware 虚拟机防拷贝方案?
查看>>
停止linux的ntpd服务
查看>>
因果性≠相关性
查看>>
Gvim在windows服务器中的安装部署
查看>>
LVS主要的调度算法
查看>>
Sublime写作
查看>>
Nginx流量拷贝模块—ngx_http_mirror_module分析
查看>>
我的友情链接
查看>>
.net面试题集锦(1
查看>>
Xcode4.2中的strong的解释
查看>>