H5页面中我们常需要进行文件上传,那么怎么来实现这个功能呢??? 我主要谈如下两种方法。

(一)、传统的form表单方法

 <form action="/Home/SaveFile1" method="post" enctype="multipart/form-data">
<input type="file" class="file1" name="file1" multiple id="file" />
<button type="submit" class="but1">上传</button>
</form> <script>
document.getElementById("file").onchange = function () {
let filesContent = document.getElementById("file").files;
console.log(filesContent);
}
</script>

这个目前大概了解一下就ok了,反正就需要form 标签,需要配置 method="post" enctype="multipart/form-data"   需要给input 加name= ""  属性。

这个方法相对比较落后了,目前不推荐这么操作,请看第二种方法。

(二)、利用FormData来实现相关的功能

1、html部分按照如下写法(vue写法)即可,当然,样式问题可以根据自己的想法把上传上去的文件样式进行优化。发现没有,这里不需要写name属性,因为后续的new formData 里面的键就代表name

 <input
type="file"
class="upload"
@change="addImg" // 监听input的改变,改变即可获取上传的文件内容。
ref="inputer"
accept="image/*" // 代表限制上传的格式,这里表示限制为图片,其他格式参照网上其他说明
multiple // 代表可以上传多个文件,去掉则不可一下子多图上传
/>

展示上传文件的大概html格式

 <div class="uploadBox" v-for="(value, key) in imgs" :key="key">
<img :src="getObjectURL(value)" alt class="uploadImg" />
<img src="../../assets/images/close.png" alt class="closeImg" @click="delImg(key)" />
</div>

2、js 部分如下:

data() {
return {
formData: new FormData(),
imgs: {}, 这个是用来保存所有的上传内容,对象格式,键值对格式
imgLen: 0,
};
},
addImg() {  // 监听了input的改变
let that = this;
let inputDOM = this.$refs.inputer; // 获取input的dom元素
this.fil = inputDOM.files; // 获取dom元素对应的files内容,注意files的内容为js对象格式,即key,value,我们真正需要的文件内容为value. for (let i = 0; i < this.fil.length; i++) { //遍历files 然后判断上传的每个文件大小,如果不符合要求则返回
let size = Math.floor(this.fil[i].size / 1024);
if (size > 5 * 1024 * 1024) {
that.$toast({
message: "请输入5M以内的文件",
position: "middle",
duration: 1500
});
return false;
}
this.imgLen++;
this.$set( // 对于符合要求的文件则push进imgs对象中,这里给文件对象的key通过时间戳进行改名,当然这里不改也可以。
this.imgs,
this.fil[i].name + "?" + new Date().getTime() + i,
this.fil[i]
); // 至此我们就把累积的上传的文件都放在了imgs对象中,相当于我们不直接用files对象,而是经过自己处理,得出的一个新的imgs对象。
      
}
},
delImg(key) { // 这个是用来把展示的文件进一步删除后的操作。
this.$delete(this.imgs, key);
this.imgLen--;
},
getObjectURL(file) {
var url = null;
if (window.createObjectURL != undefined) {
url = window.createObjectURL(file);
} else if (window.URL != undefined) {
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) {
url = window.webkitURL.createObjectURL(file);
}
return url;
},

传完毕文件并展示出来后,那么我们就需要进行正式上传了,如下便是js真正提交的方法。

ajax方法上传一张图片及多张图片的方法

 submit() {
let that = this;
    
    // 单张图的方法
    for (let key in this.imgs) { //即使上传一张图片也得进行循环,要么无法拿到value的值。
this.formData.append('filename', this.imgs[key]); // 注意这里的filename 和input 直接写name = "filename" 是等价的!!!也就是这个名字需要和后台进行约定!!!

}
    
// 多张图的方法
     for (let key in this.imgs) {
        this.formData.append('filename[]', this.imgs[key]);   //这里代表上传多张图片的时候,相当于最后filename是一个数组了,而且filename是一个push进去的数据。
      }
this.formData.append('id', that.id);  // formdata不仅可以传文件,也可以顺便传点普通的值!!!下同
this.formData.append('uid', that.uid);
this.formData.append('content', that.desc);
mui.showLoading("图片上传中..","div");
$.ajax({
url: api_url + '/api2_1/TaskApply/tkAdd2',
type: 'POST',
cache: false, //上传文件不需要缓存
data: this.formData,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: function (res) {
console.log(res)
if (res.code == 200) {
mui.hideLoading();
window.location.href = "index.html";
} else if (res.code == 401) {
mui.toast("图片不能为空", {
duration: 'short',
type: 'div'
});
}
},
error: function (data) {
console.log(data)
}
})
},

axios 上传图片的方法

 let config = {
headers: { "Content-Type": "multipart/form-data" }
};
console.log(that.imgs);
for (let key in that.imgs) {
that.formData.append("filename[]", that.imgs[key]);
}
that.$post("/Recruit/uploadfile", that.formData, config).then((res)=>{ })

完毕!!!

尤其需要注意多图上传的写法。

H5利用formData来上传文件(包括图片,doc,pdf等各种格式)方法小结!的更多相关文章

  1. 利用formdata对象上传文件时,需要添加的参数

    function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'h ...

  2. 使用FormData上传文件、图片

    关于FormData XMLHttpRequest Level 2添加了一个新的接口  ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XM ...

  3. 通过jQuery Ajax使用FormData对象上传文件

    FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...

  4. IT轮子系列(四)——使用Jquery+formdata对象 上传 文件

    前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...

  5. 通过jQuery Ajax使用FormData对象上传文件 (转载)

    XMLHttpRequest Level 2 添加了一个新的接口——FormData.与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件.jQuery 2.0+ ...

  6. [转] 通过jQuery Ajax使用FormData对象上传文件

    FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...

  7. python中使用multipart/form-data请求上传文件

    最近测试的接口是上传文件的接口,上传单个文件,我主要使用了2种方法~ 接口例如: URL: http://www.baidu.com/*** method:post 参数: { "salar ...

  8. 使用python或robotframework调multipart/form-data接口上传文件

    这几天调一个multipart/form-data类型的接口,遇到点小阻碍.之前同事有使用urllib库写了个类似的方法实现,比较长,想要改的时候发现不太好使.在网上查找发现用requests库做这个 ...

  9. Webform之FileUpload(上传按钮控件)简单介绍及下载、上传文件时图片预览

    1.FileUpload上传控件:(原文:http://www.cnblogs.com/hide0511/archive/2006/09/24/513201.html) FileUpload 控件显示 ...

随机推荐

  1. 使用 kill 命令杀死 java进程,你用对了吗?

    在本地调试agent相关功能,需要经常性的杀掉Java进程,验证一些极端情况. 每次都是本能执行如下步骤 jps kill -9 <pid> reboot 有一次验证,发现代码中添加的Sh ...

  2. 使用密码远程QQ时窗口闪退

    系统时间不一致,在QQ上使用密码远程时会闪退,把系统时间调到大概一致就行了.

  3. 【JVM】记录一次线上SWAP偏高告警的故障分析过程

    近期遇到一个堆外内存导致swap飙高的问题,这类问题比较罕见,因此将整个排查过程记录下来了 现象描述 最近1周线上服务器时不时出现swap报警(swap超过内存10%时触发报警,内存是4G,因此swa ...

  4. 【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序

    在C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,Ord ...

  5. 物料管理混乱怎么办?APS系统帮你实现高效运输

    APS系统可以高效地管理.控制分销中心并保证产品可订货.可盈利.能力可用.分销计划帮助企业分析原始信息,然后企业能够确定如何优化分销成本或者根据生产能力和成本提高客户服务水平. 今天成功的企业为了取得 ...

  6. leetcode 学习心得 (1) (24~300)

    源代码地址:https://github.com/hopebo/hopelee 语言:C++ 24.Swap Nodes in Pairs Given a linked list, swap ever ...

  7. [LeetCode] 543. 二叉树的直径 ☆(递归、数最大深度)

    描述 给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长 ...

  8. MySQL Index--平衡树结构

    树结构 ==================================================B树,即平衡二叉树,每个非叶子节点最多拥有两个子节点.所有键值出现在叶子节点和非叶子节点. ...

  9. wget详解

    wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...

  10. AD中怎么将字体stroke全部改为truetype?

    shift+F 智能查找功能,然后鼠标会变成十字状,你点一下你的这个字体会弹出如下: 一开始如果你没有改动过字体那应该都是同一总字体 在1的地方选择same,你点apply再点OK就可以把全部stro ...