input file 上传图片问题
html代码如下:
<input id="fileup" type="file" accept="image/*" capture="camera" >
js代码:
$('#fileup').change(function (e) { /*var val= $('#upimg').valueOf()*/ var file = $('#fileup')[0].files[0]; //创建读取文件的对象 var reader = new FileReader(); //创建文件读取相关的变量 var imgFile; //为文件读取成功设置事件 reader.onload = function (e) { imgFile = e.target.result; var index= layer.open({ type: 2 ,content: '正在上传...', shadeClose:false });//提示正在上传 $.ajax({ url: '', type: "POST", data: {imgsrc: imgFile}, success: function (data) { if(data.success==true) { layer.close(index);//关闭提示框 $(".up img").attr("src", data.imageUrl); } } }); };
这里我们会踩到一些坑:
android手机微信内置浏览器上传时,会出现change事件无效,所以在这里特别提醒下在input内要加上capture="camera";
这里我是直接获取上传图片的base64码(e.target.result),由后端处理返回数据。
大家也可以用创建dataform来提交数据:
var fd = new FormData(); fd.append("upload", 1); fd.append("upfile", $(".fileup")[0].files[0]);
FormData包含append方法可直接调用
接下来是第三种方法:
<form action='XXXXXXXXXXXX' method='post' enctype='multipart/form-data><input type="file" accept="image/*" capture="camera"> </form>
通过原生表单提交的方式来进行上传
enctype
属性规定在发送到服务器之前应该如何对表单数据进行编码,默认的编码是:”application/x-www-form-urlencoded
“。对于普通数据是挺适用的,但是,对于文件,科科,就不能乱编码了,该什么就是什么,只能使用multipart/form-data
作为enctype
属性值。
下面是对FileReader作一个补充:
- readAsDataURL() 方法。//将文件读取为base64的格式,也就是可以当成图片的src
- result 属性 //将读取的数据保存在result里。
- progress 事件 //定时触发,来获取当前已上传文件的大小,如进度条
- loade 事件 //文件上传完成时触发
- loadend 事件 //文件上传完成时(不管成功、失败)触发
-
var reader = new FileReader(); //新建FileReader对象 reader.readAsDataURL(file); //读取为base64 //以下代码可以删除 reader.onloadstart = function(){ ... //开始读取 }; reader.onprogress = function(e){ //这个是定时触发的事件,文件较大的时候较明显 var p = '已完成:' + Math.round(e.loaded / e.total * 100) + '%' ;//上传完成进度 }; reader.onabort = function(){ ... //用作取消上传功能 }; reader.onerror = function(){ console.log('error'); //文件读取出错的时候触发 }; reader.onload = function(){ console.log('load complete'); //完成 };