效果php
實現過程分爲兩步html
1. 用戶點擊添加後經過 H5文件讀取 FileReader對象以DataURL的格式讀取圖片ajax
2. 經過FormData對象生成表單數據,經過ajax上傳到後臺數組
HTML瀏覽器
<style> .file-box{display: inline-block;position: relative;padding: 3px 5px;overflow: hidden;color:#fff;background-color: #ccc;} .file-btn{position: absolute;width: 100%;height: 100%;top: 0;left: 0;outline: none;background-color: transparent;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;} .prev-box{display: inline-block; min-width: 200px;min-height: 120px;border-radius: 5px;padding: 5px;border:1px #ccc dotted;} </style> <body> <form id="form1"> <div class="file-box"> <input type="file" class="file-btn" onChange="uploadImg(this)" accept="image/*" name="image"/> 上傳文件 </div> <br> <div class="prev-box" id="prev-box"> <img style="width: 200px;" id="img"> </div> <div id="uploadMsg" style="color: #f00"></div> </form> </body>
JS服務器
function uploadImg(obj){ //1. 圖片預覽 //若是瀏覽器不支持 FileReader 則用文字提示 if(typeof FileReader == 'undefined'){ var prevBox = document.getElementById('prev-box') prevBox.innerHTML = "瀏覽器不支持預覽" }else{ //獲取上傳文件,返回 File對象 var file = obj.files[0]; var reader = new FileReader() //註冊讀取成功的回調函數 reader.onload = function (e) { var img = document.getElementById("img"); img.src = e.target.result; } //開始以 DataURL格式讀取文件 reader.readAsDataURL(file) } //2. 圖片上傳 if(typeof FormData == 'undefined'){ alert('瀏覽器不支持圖片上傳') }else{ var form = document.getElementById('form1') var data = new FormData(form) //添加自定義字段 data.append("CustomField", "This is some extra data") //ajax請求 var httpRequest = new XMLHttpRequest(); httpRequest.open("POST", "upload.php", true); httpRequest.onload = function(oEvent) { if (httpRequest.status == 200) { //服務器返回的保存路徑 console.log(httpRequest.responseText) } else { document.getElementById('uploadMsg').innerHTML = '圖片上傳失敗,錯誤碼:' + httpRequest.status } }; httpRequest.send(data); } }
相關知識app
1. 經過獲取 <input type="file" /> 的files獲取結果爲 File對象的僞數組集合函數
2. FileReader 支持輸出多個格式 readAsDataURL( ) 、readAsText( ) 、readAsArrayBuffer( ),他們都接收一個 File 或者 Blob 對象做爲參數this
3. FileReader 對象支持多個事件回調 onloadstart( ) --開始讀取、onprogress( ) --正在讀取、onabort( ) --讀取中斷、onload( ) -- 讀取成功,讀取成功後數組保存在事件對象中 e.target.resultspa
4. FromData 對象能夠單首創建,也能夠經過Form建立,使用append添加字段
5. 若是FormData對象是經過表單建立的,則表單中指定的請求方式會被應用到方法open()中 。