formdata上传文件

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

<form id="myForm" name="myForm">
  <div>
    <label for="username">Enter name:</label>
    <input type="text" id="username" name="username">
  </div>
  <div>
    <label for="useracc">Enter account number:</label>
    <input type="text" id="useracc" name="useracc">
  </div>
  <div>
    <label for="userfile">Upload file:</label>
    <input type="file" id="userfile" name="userfile">
  </div>
<input type="submit" value="Submit!">
</form>


var myForm = document.getElementById('myForm');
formData = new FormData(myForm);

2.formdata上传文件

目录结构

.
├── index.js
├── node_modules
├── package.json
└── public
    ├── index.html
    └── uploads
客户端代码

 <!-- index.html -->

    <input id="file" type="file">
    <button id="btn">点击上传</button>
    <img id="img" src="" alt="">
    <script>
        var btn = document.getElementById("btn"),
            file = document.getElementById("file"),
            img = document.getElementById("img");
        btn.onclick = function () {

            // 获取文件
            var upload_file = file.files[0],
                formdata = new FormData(),
                xhr = new XMLHttpRequest();

            formdata.append('date',new Date().toLocaleString());  

            // 将文件添加到formdata对象中,(注:下面的file字段名在node中有用)

            formdata.append('file', upload_file);
            xhr.open("POST", "/upload", true);
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    img.src = xhr.responseText;
                }
            }
            xhr.send(formdata);
        }
    </script>

服务端代码

// index.js

var 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文档

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在控制台打印为空


image.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方法

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

文章都是学习过程中的总结,如果发现错误,欢迎留言指出,如果你热爱分享知识那就加入我们吧 群号:431679880

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352