UI如圖所示,其中有一個拍照圖標,點擊後要選擇拍照或者從相冊中選擇要上傳的圖片。
css
拍照上傳部分的代碼以下html
html部分ajax
<div class="take-photo"> <img src="./images/take-photo.png" class="take-phote-picture"> <input type="file" name="file" accept="images/*" class="select-picture"> </div>
css部分json
.take-phote-picture{ margin: 10px 20px; width: 100px; } .select-picture{ opacity: 0; position: absolute; width: 100px; height: 100px; top: 10px; left: 70px; border-radius: 50px; }
設計思路api
將一個
input[type="file"]
的透明度設置爲0,懸浮在img
標籤之上。經過給input
標籤綁定change
事件,獲取上傳的文件,異步上傳。跨域
經過ajax
的data
屬性提交到後臺的數據必須是鍵值對(key-value
)的形式,其中值value
不能爲二進制數據。而經過input
的files
屬性獲取的上傳文件被格式化爲二進制形式。app
define([], function () { /** * 跨域異步post提交工具 使用Formdata,非iframe 提交 */ var ifajax = function(_url){ var data = new FormData(); var obj ={}; obj.appendInput = function (input_obj) { if (input_obj.files) { for (var i = 0; i < input_obj.files.length; i++) { data.append(input_obj.name, input_obj.files[i]); } } else { data.append(input_obj.name, input_obj.value); } return this; }; obj.submit = function (success,err) { var xhr = new XMLHttpRequest(); var url = _url||"/club/apiv1/me/b64-upload"; xhr.open("POST", url, true); xhr.setRequestHeader('Accept', '*/*'); xhr.onload = function () { if (xhr.status == 200) { if (xhr.responseText) { try { //console.log(xhr); var json = $.parseJSON($.trim(xhr.responseText)); success && success(json); } catch (e) { err && err("parse error", xhr.responseText); } } } else { var message = xhr.responseText, code = xhr.status; if (code === 413) { message = "上傳文件大小超過限制" } else { try { var json = $.parseJSON(xhr.responseText); message = json.message; code = json.code; } catch (e) { } } err && err (code, message); } }; xhr.send(data); return; } return obj; }; return ifajax; });
此外,還能夠藉助插件
ajaxFileUpload
實現異步上傳文件異步