本文主要討論以下兩部分:
一、實現圖片及時預覽,將用戶選中的圖片及時顯示在前台頁面(利用FileReader實現);不用通過后台接口返回的圖片地址賦值給src再展示到前台,減少前后台的頻繁交互;
二、通過后台接口,將圖片上傳到服務器中(FormData)。
首先介紹一下h5新增的FileReader對象():
FileReader:讀取文件內容
具體可以參考 https://www.cnblogs.com/hhhyaaon/p/5929492.html ,介紹的很詳細。
一、實現圖片及時預覽
首先是html代碼:
1 <form action="" enctype="multipart/form-data" method="post" name="form1" id="form1"> 2 文件:<input type="file" name="myFile" id="myFile" onchange="getFileContent();" multiple> 3 <!-- 進度條 --> 4 <div></div> 5 <input type="submit"> 6 </form>
7 <!-- 圖片展示區域 --> 8 <ul id="imgList"></ul>
css樣式:
1 <style> 2 ul{ 3 list-style: none; 4 } 5 li{ 6 float: left; 7 border: 1px solid #000; 8 margin: 10px; 9 } 10 li img{ 11 display:block; 12 } 13 div{ 14 width: 0%; 15 height: 20px; 16 background-color: lightcoral; 17 } 18 </style>
頁面效果是這樣子:
1、上傳 單個圖片 的js代碼:
1 function getFileContent(){ 2 // file[0]就是上傳的圖片本身 3 // FileReader的readAsDataURL方法可以將圖片轉換為base64格式 4 // 1.上傳單個文件時: 5 var reader = new FileReader(); 6 var file = document.querySelector("#myFile").files; 7 reader.readAsDataURL(file[0]); 8 // 一定要在文件讀取 成功完成時 再進行相應的操作: 9 reader.onload = function(){ 10 document.querySelector("img").src = reader.result; 11 } 12 }
其中file打印出是:里面包含用戶上傳的文件名稱、大小、類型,如果想限制圖片大小和類型,可以自行添加判定條件~
2、上傳 多個圖片 的js代碼:
每上傳一張圖片(一個文件)就需要創新創建一個 FileReader 實例,否則會出現一些問題(只成功上傳了選中的最后一張圖片);
這里將上傳單個圖片封裝為一個函數,在循環遍歷用戶選擇的文件時,一一上傳圖片,每個圖片都有上傳時的進度條。
1 function getFileContent(){ 2 // 上傳多個文件時: 3 var file = document.querySelector("#myFile").files; 4 var totalSize = 0; 5 // 限定文件總數不能超過的大小 6 var maxSize = 10*1024*1024; 7 for(var i=0;i<file.length;i++){ 8 totalSize += file[i].size; 9 if(file[i].size > maxSize){ 10 alert("文件不能超過10M") 11 return false; 12 }else{ 13 // 調用上傳多個圖片的方法,傳入的參數為:用戶選中的文件 和 每個圖片的 index 14 uploadMultiImg(file,i); 15 } 16 } 17 } 18 19 // 上傳多個圖片的方法: 20 function uploadMultiImg(file,index){ 21 var li = document.createElement("li"); 22 ul.appendChild(li); 23 var img = document.createElement("img"); 24 li.appendChild(img); 25 /*1.1 由於IE9以下沒有FileReader,因此先判斷是否支持FileReader 並且 創建文件讀取對象*/ 26 if(window.FileReader) { 27 var reader = new FileReader(); 28 } else { 29 alert("您的設備不支持圖片預覽功能,如需該功能請升級您的設備!"); 30 } 31 // 1.2 是否是圖片 32 var imageType = /^image\//; 33 if(!imageType.test(file[index].type)) { 34 alert("請選擇圖片!"); 35 return; 36 } 37 /*2.讀取文件,獲取DataURL 38 * 2.1.說明沒有任何的返回值:void:但是讀取完文件之后,它會將讀取的結果存儲在文件讀取對象的result中 39 * 2.2.需要傳遞一個參數 binary large object:文件(圖片或者其它可以嵌入到文檔的類型) 40 * 2.3:文件存儲在file表單元素的files屬性中,它是一個數組*/ 41 reader.readAsDataURL(file[index]); 42 /*獲取數據*/ 43 reader.onload = function(){ 44 /*展示:圖片路徑設置為讀取的圖片*/ 45 img.src = reader.result; 46 img.style.width = '300px'; 47 img.style.height = '300px'; 48 } 49 50 // 進度條 51 reader.onprogress = function(e){ 52 var percent = e.loaded / e.total * 100 + '%'; 53 div.style.width = percent; 54 var number = (e.loaded / e.total * 100).toString().substring(0,5) + '%'; 55 div.innerText = number; 56 } 57 }
進度條是通過reader.onprogress()方法實現,打印e:loaded是已上傳的大小,total是文件總大小。通過二者的比例可以自定義一個進度條。
最終效果:
二、將圖片上傳到服務器中(FormData對象)
參考文章:
https://blog.csdn.net/lijia_1983370657/article/details/80489979
https://blog.csdn.net/thunderevil35/article/details/80953236
https://www.cnblogs.com/hutuzhu/p/4409292.html
使用 h5的 formData 對象 用ajax異步的方式提交form表單(還可以實現異步提交文件)
在使用 jquery 發送圖片到后台時要注意幾點:
- <form>標簽添加 enctype="multipart/form-data" 屬性
- jQuery 的 ajax 中 processData 設置為 false (表示不需要對數據做處理)
- jQuery 的 ajax 中 cache 設置為 false (表示上傳文件不需要緩存)
- jQuery 的 ajax 中 contentType 設置為 false (因為前面已經聲明了是‘FormData對象’)
如果沒有<form>
標簽,也沒有 enctype="multipart/form-data"
屬性,可以使用 FormData 的 append() 方法來手動添加 如用戶名、文件等內容。
1 var formData = new FormData($('#form1')); 2 // formData.append('images', $('#myFile')[0].files); 3 //ajax請求 4 $.ajax({ 5 type: "post", 6 url: "接口地址", 7 data: formdata, 8 dataType: 'json', 9 processData: false, // 告訴jQuery不要去處理發送的數據 10 contentType: false, // 告訴jQuery不要去設置Content-Type請求頭 11 xhrFields:{withCredentials:true}, 12 async: true, //默認是true:異步,false:同步。 13 success: function (data) { 14 callback(data); 15 }, 16 error: function (data) { 17 layer.msg('請求異常'); 18 }, 19 });
如果使用原生js實現,如下代碼:
1 function fsubmit() { 2 var form=document.getElementById("form1"); 3 var formData=new FormData(form); 4 var oReq = new XMLHttpRequest(); 5 oReq.onreadystatechange=function(){ 6 if(oReq.readyState==4){ 7 if(oReq.status==200){ 8 var json=JSON.parse(oReq.responseText); 9 var result = ''; 10 // result += 'name=' + ret['name'] + '<br>'; 11 // result += 'gender=' + ret['gender'] + '<br>'; 12 result += '<img src="' + json['photo'] + '" width="100">'; 13 $('#result').html(result); 14 } 15 } 16 } 17 oReq.open("POST", "server.php"); 18 oReq.send(formData); 19 return false; 20 }