图片上传有很多种形式,但是听说ios只能传字符串,所以为了安卓、ios和web能用一个接口上传图片,采用了基于base64 的方法上传图片。
下面是我的html
1 <div class="parn"> 2 <h6>店铺宣传海报</h6> 3 <div class="img-div"> 4 <img src="" class="add_img11" id="store_img"> 5 <input type="file" class="files" onchange="updataimg(this)"> 6 <div class="remarks">海报大小尽量限制在1M以内</div> 7 </div> 8</div>
然后布局的话,大家就随意吧。最主要的就是img标签用来显示图片,我们这里的原理是这样的:先是图片上传,上传成功之后,后台给返回你上传图片的服务器地址,然后显示在这个img标签中。然后input是一个上传的标签,其中用updataimg这个函数来写上传的最主要的js代码;
这里是JS代码
1 function updataimg(fileObj){ 2 var file_img = fileObj.files['0']; 3 //创建读取文件的对象 4 var reader = new FileReader(); 5 //创建文件读取相关的变量 6 var imgFile; 7 //为文件读取成功设置事件 8 reader.onload=function(e) { 9 //alert('文件读取完成'); 10 imgFile = e.target.result; //这里就已经是base64的格式了 11 //console.log(imgFile); 12 var newsIndex = imgFile.indexOf(","); 13 var news = imgFile.substr(parseInt(newsIndex + 1)); 14 //console.log(news); 15 $.ajax({ 16 type: "post", 17 url: base_url + "ZITAOHUI/upload/image", 18 data: { 19 "imageData": news 20 }, 21 dataType: "json", 22 success: function(data) { 23 if(data.code == 1) { 24 var _url = data.extend.msg.fileUrl; 25 $('.add_img11').attr('src',_url); 26 placard = _url; 27 } else { 28 alert("上传失败,请刷新后重试"); 29 } 30 }, 31 error: function(error) { 32 33 } 34 }); 35 }; 36 //console.log(file_img.size); 37 if(file_img.size>1024*1024){ 38 alert('图片大小大于1M,请压缩图片后重试'); 39 }else{ 40 //正式的读取文件 41 reader.readAsDataURL(file_img); 42 } 43 44 }
这里用一点需要注意的是41行的代码;用reader.readAsDataURL(file),根据大家编程经验也都能看出,就是调用FileReader类中的readAsDataURL方法,并把之前获取的file对象传进去。如果读取成功,则调用reader.onload事件。也就是说41行的代码是在8行的代码执行之前的,也就是为什么我们的对图片的大小判断要在这之前进行。
在代码的10行,我们获取的就已经是base64的代码结构了。然后12和13行的代码是为了把base64的前面的格式去掉;请看下面的两幅图(11行和14行的打印结果);
然后通过ajax上传,就能上传到服务器了。