摘要:拍照預(yù)覽壓縮上傳采坑記錄公司項目前段時間需要實現(xiàn)手機(jī)拍照上傳的功能,本來以為用和可以很輕松的實現(xiàn),結(jié)果發(fā)現(xiàn)問題多多,特此記錄下來。完整代碼如下如果不支持壓縮,直接上傳原始圖片組裝二進(jìn)制組裝參考文章
H5拍照、預(yù)覽、壓縮、上傳采坑記錄
公司項目前段時間需要實現(xiàn)手機(jī)拍照上傳的功能,本來以為用createObjectURL和canvas可以很輕松的實現(xiàn),結(jié)果發(fā)現(xiàn)問題多多,特此記錄下來。
DEMO預(yù)覽(需用新標(biāo)簽頁打開)
圖片預(yù)覽在IOS上,豎著拍照片時,圖片預(yù)覽會旋轉(zhuǎn)90°,橫著拍照就沒問題,我實驗了一下,在IOS上,只有當(dāng)圖片的分辨率過大會出現(xiàn)這種情況。
最后實現(xiàn)圖片預(yù)覽效果借助了exif-js和megapix-image,exif-js負(fù)責(zé)讀取圖片的EXIF信息,獲取orientation信息,然后用megapix-image把圖片數(shù)據(jù)渲染在img標(biāo)簽上,代碼如下:
import EXIF from "../utils/exif"; import MegaPixImage from "../utils/megapix-image"; /** * * @param file file對象 * @param resImg 預(yù)覽IMG標(biāo)簽 * @returns {Promise} */ renderPreviewImg(file, resImg) { return new Promise(function (resolve, reject) { EXIF.getData(file, _=> { var allMetaData = EXIF.getAllTags(file); var orientation = allMetaData.Orientation; var mpImg = new MegaPixImage(file); mpImg.render(resImg, { maxWidth: 1024, maxHeight: 1024, // quality: 0.6, orientation: orientation }, resolve); }); }); }無刷新壓縮上傳
思路有兩種:
用canvas的toDataURL()API,直接將base64文本傳遞過去
自己構(gòu)造File對象,ajax上傳
第一種方法需要服務(wù)器端做工作,而且上傳數(shù)據(jù)量會增大4/3,因此此方法只作為回退方案。
第二種方法的原理是用Uint8Array來構(gòu)造Blob,再使用formData上傳。
這里要注意的是:ArrayBuffer不能被直接操作,必須通過typed array來存取,而且Blob的構(gòu)造函數(shù)也是typed array。
完整代碼如下:
this.renderPreviewImg(file, resImg) .then(() => { try { var binaryData = null; if (!Blob || !ArrayBuffer || !Uint8Array) { // alert(123); binaryData = file;//如果不支持壓縮,直接上傳原始圖片 } else { //組裝二進(jìn)制 var base64Data = $(resImg).attr("src"); var byteString = atob(base64Data.split(",")[1]); var ab = new ArrayBuffer(byteString.length); var ia = new Uint8Array(ab); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } binaryData = new Blob([ia], { "type": file.type }); } this.setState({ uploadProgress: 0 }); //組裝formData var fd = new FormData(); fd.append("file", binaryData, "img.jpg"); fd.append("token", uploadToken); console.log(fd); return this.uploadBinaryDataToQiniu(fd, this.uploadSuccess.bind(this), this.handleUploadProgress.bind(this)) } catch (e) { alert(e.message); } }).catch(function (e) { console.log(e); })參考文章
http://tgideas.qq.com/webplat...
http://blog.csdn.net/hsany330...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81382.html
摘要:決定自己寫一個移動端圖片上傳組件。允許多選,加上事件的回調(diào)函數(shù)。在的回調(diào)函數(shù)中,我們能通過拿到所選擇的文件,但是文件是無法展示在頁面上的,通常的做法是使用轉(zhuǎn)為然后展示在頁面上。 背景 前段時間項目重構(gòu),改成SSR的項目,但之前用的圖片選擇上傳組件不支持SSR(server-side-render)。遂進(jìn)行了調(diào)研,發(fā)現(xiàn)很多的工具。但有的太大,有的使用麻煩,有的不滿足使用需求。決定自己寫一...
摘要:關(guān)于移動端拍照上傳圖片的解決方案場景產(chǎn)品要求用戶拍一張身份證和一張人像,然后后臺調(diào)用商用接口比對證件和人像的匹配度。缺點(diǎn)手機(jī)拍照圖片過大,壓縮后,圖片依然大,沒上傳一次花費(fèi)時間過長,最后再調(diào)用接口比對時間花費(fèi)也長。 關(guān)于移動端拍照上傳圖片的解決方案 場景 產(chǎn)品要求用戶拍一張身份證和一張人像,然后后臺php調(diào)用商用接口比對證件和人像的匹配度。showImg(https://segment...
閱讀 3467·2023-04-26 00:39
閱讀 4076·2021-09-22 10:02
閱讀 2557·2021-08-09 13:46
閱讀 1108·2019-08-29 18:40
閱讀 1455·2019-08-29 18:33
閱讀 782·2019-08-29 17:14
閱讀 1523·2019-08-29 12:40
閱讀 2984·2019-08-28 18:07