移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象

摘要:
前些时候遇到移动端需要上传图片和视频的问题,之前一直通过ajax异步的提交数据,所以在寻找通过ajax上传文件的方法。发现了H5里新增了一个FormData对象,通过这个对象可以直接绑定html中的form元素,然后通过ajax提交的时候直接提交这个对象就好了。

前些时候遇到移动端需要上传图片和视频的问题,之前一直通过ajax异步的提交数据,所以在寻找通过ajax上传文件的方法。发现了H5里新增了一个FormData对象,通过这个对象可以直接绑定html中的form元素,然后通过ajax提交的时候直接提交这个对象就好了。

在移动端调用视频和音频:

<input type="file"accept="image/*"capture="camera">//调用相册和摄像头
<input type="file"accept="video/*"capture="camcorder">  //视频
<input type="file"accept="audio/*"capture="microphone">  //音频

以上传图片为例

html中的代码:

<input type="file"id="file"name="file"accept="image/*" />

当然如果你想要上传多张图片也是可以的,只要加上“multiple”属性

<input type="file"id="file"name="file"accept="image/*"multiple />

(其实只需要写上type和id就可以了)

我们可以通过打印台看到传到的里面的内容

var file = document.getElementById("file");
console.log(file.files);

得到的是一个类似于一个数组的泛类集合,我们可以像取数组一样取到第i个:file.files[i]

移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象第1张

在JS中,我们需要先new一个FormData对象

var form = new FormData();

然后把我们传完的图片添加到这个FormData对象中去,这里用到append

form.append("fileImg",file.files);

然后我们就可以通过ajax向后台传递数据了,我习惯用的jquery的ajax

$.ajax({
      type: "post",
      url: "传输的地址",
      data: form,
      contentType: false, //注意这里应设为false
      processData: false,    //false
      cache: false,    //缓存
      success: function(data){
          console.log(data);      
      }
})

注意:里面设为false的三个参数:

contentType:发送信息至服务器时内容编码类型,默认是application/x-www-form-urlencoded

processData:默认会把data的数据转为字符串

cache:设置为 false 将不缓存此页面

这里如果是跨域传输的话会出现问题,传文件时是不能设置dataType:"jsonp"的,会出现问题,想要跨域的话尽量不要使用这个方法(是我比较菜还不会传,手动捂脸,欢迎指导),当然通过后台设置允许访问的地址也可以

FormData对象是封闭的,没有办法通过console.log(form)打印到打印台,想要查看form对象里的值可以通过浏览器调试工具的Network里查看

通常我们传递数据当然不是只传文件,因此我们需要把要传的每一条都append到FormData里。

我们可以在html中加一个form表单并获取到它的id,然后form表单中的数据可以直接绑到FormData里

html:

<form id="formTest">
    <input type="text"name="name1" />
    <input type="text"name="name2"/>
    <input type="file"name="file"id="file"/>
</form>

js:

var formTest = document.getElementById("formTest");
var form = new FormData(formTest);

这样会自动获取到form表单中name和value并添加到formdata对象里

通常我们在传入图片后,会想让图片在前台页面展示,这里我们要用到H5的FileReader。

我的做法是:前端放一张图片,点击图片的时候触发隐藏的上传文件的input,input改变时调用prewviewImg方法

html:

<div class="pic"id="wholeImg"><img id="img1"src="img/a11.png"/></div>
<input type="file"name="whole"id="whole"style="display: none;"capture="camera"onchange="previewImg(this)" />

js:

$("#wholeImg").click(function(){
    $("#whole").click();
})


functionpreviewImg(file){
    //判断是否支持FileReader
    if(window.FileReader) {
        var reader = newFileReader();
    } else{
        alert("您的设备不支持图片预览功能,如需该功能请升级您的设备!");
    }
    var preDiv = document.getElementById("wholeImg");
    //获取图片
    if (file.files && file.files[0]){
        var reader = newFileReader(); 
        reader.onload = function(e){  
            var img = document.getElementById("img1");
            img.setAttribute("src",e.target.result);
        }
        reader.readAsDataURL(file.files[0]);
    }
}

这样就可以显示图片的内容了

免责声明:文章转载自《移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 性能优化:使用 Lint 优化代码、去除多余资源shell计算时间差下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

移动端嵌入pdf.js远程请求pdf出现(206)

最近在做移动端的开发,需要嵌入pdf进行预览。看了很多的js组件后选择了pdf.js;使用起来还是比较方便的,至于使用网上有很多的教程。 但在使用过程中出现了如下一个问题(我做的是IOS系统): 问题是由于服务器对http的get请求进行了数据的部分响应,导致pdf无法继续打开。尝试了很多方法,修改请求头等方式都不成功; 最后,通过查询pdf.js中的c...

web高拍仪图片上传

公司引进高拍仪,想拍完照片点上传按钮直接上传图片。高拍仪接口能提供照片的本地路径,现在的问题是不用file控件选择,只有路径,不知道如何上传到服务器,求解决方案。   方法: 使用泽优Web图片上传控件(img2)帮助解决图片手动上传的问题,使用img2后可以自动上传本地路径下面的图片,不需要用户再手动选择图片。   优势: 1.不需要通过AJAX上传BA...

flask中使用ajax 处理前端POST请求 弹框展示

菜小鱼初次使用 ajax,想前端提交数据,后端处理后,将结果以弹框的形式展示,在网上查看了好多,不停的调试,终于调通了 html: 1 <html> 2 <head></head> 3 <body> 4 <form class="formXXX1" method="post"> 5 &l...

关于for循环里面异步操作的问题

一、使用自执行函数   1、当自执行函数在循环当中使用时,自执行函数会在循环结束之后才会运行。比如你在自执行函数外面定义一个数组,在自执行函数当中给这个数组追加内容,你在自执行函数之外输出时,会发现这个数组当中仕么都没有,这就是因为自执行函数会在循环运行完后才会执行。   2、当自执行函数在循环当中使用时,要是自执行函数当中嵌套ajax,那么循环当中的下标...

Flask--wtforms快速使用和表单验证(附示例)

一、Form类   表单提供WTForms中最高级别的API。它们包含您的字段定义,委托验证,获取输入,聚合错误,并且通常用作将所有内容组合在一起的粘合剂。 class wtforms.form.Form 声明式表格基类。 __init__(formdata=None, obj=None, prefix='', data=None, meta=None,...

form表单提交的几种方式

表单提交方式一:直接利用form表单提交(主线程提交) html页面代码: 1.提交普通内容: 1 <body> 2 <form action="http://localhost:8080/user" method="post"> 3 username:<input type="text" name="username...