From 81281856e5fa7129504bd287976d519c6fbac23a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E8=83=9C=E5=BC=BA?= Date: Thu, 6 Dec 2018 20:01:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=97=B6=E4=B8=A2=E5=A4=B1=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/platforms/h5/service/api/file/util.js | 50 +++++++++++++------ .../h5/service/api/media/choose-image.js | 6 ++- .../h5/service/api/media/choose-video.js | 6 ++- .../h5/service/api/network/download-file.js | 4 +- .../h5/service/api/network/upload-file.js | 37 +++++--------- 5 files changed, 59 insertions(+), 44 deletions(-) diff --git a/src/platforms/h5/service/api/file/util.js b/src/platforms/h5/service/api/file/util.js index 82f06ea9..71aa45a8 100644 --- a/src/platforms/h5/service/api/file/util.js +++ b/src/platforms/h5/service/api/file/util.js @@ -1,18 +1,30 @@ /** - * 从url读取Blob + * 暂存的文件对象 + */ +const files = {} +/** + * 从url读取File * @param {string} url - * @param {Function} success - * @param {Function} error + * @param {Promise} */ -export function urlToBlob (url, success, error) { - var xhr = new XMLHttpRequest() - xhr.open('GET', url, true) - xhr.responseType = 'blob' - xhr.onload = function () { - success(this.response) +export function urlToFile (url) { + var file = files[url] + if (file) { + return Promise.resolve(file) } - xhr.onerror = error - xhr.send() + if (/^data:[a-z-]+\/[a-z-]+;base64,/.test(url)) { + return Promise.resolve(base64ToBlob(url)) + } + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest() + xhr.open('GET', url, true) + xhr.responseType = 'blob' + xhr.onload = function () { + resolve(this.response) + } + xhr.onerror = reject + xhr.send() + }) } /** * base64转Blob @@ -32,9 +44,19 @@ export function base64ToBlob (base64) { } /** * 从本地file或者blob对象创建url - * @param {Blob|File} blob + * @param {Blob|File} file * @return {string} */ -export function blobToUrl (blob) { - return (window.URL || window.webkitURL).createObjectURL(blob) +export function fileToUrl (file) { + for (const key in files) { + if (files.hasOwnProperty(key)) { + const oldFile = files[key] + if (oldFile === file) { + return key + } + } + } + var url = (window.URL || window.webkitURL).createObjectURL(file) + files[url] = file + return url } diff --git a/src/platforms/h5/service/api/media/choose-image.js b/src/platforms/h5/service/api/media/choose-image.js index 55293337..96eb8957 100644 --- a/src/platforms/h5/service/api/media/choose-image.js +++ b/src/platforms/h5/service/api/media/choose-image.js @@ -1,3 +1,5 @@ +import { fileToUrl } from '../file/util' + const { invokeCallbackHandler: invoke } = UniServiceJSBridge @@ -44,7 +46,7 @@ export function chooseImage ({ const fileCount = event.target.files.length for (let i = 0; i < fileCount; i++) { const file = event.target.files[i] - const filePath = window.URL.createObjectURL(file) + const filePath = fileToUrl(file) tempFilePaths.push(filePath) tempFiles.push({ @@ -63,4 +65,4 @@ export function chooseImage ({ }) imageInput.click() -} +} diff --git a/src/platforms/h5/service/api/media/choose-video.js b/src/platforms/h5/service/api/media/choose-video.js index 69e0fc7b..e8608424 100644 --- a/src/platforms/h5/service/api/media/choose-video.js +++ b/src/platforms/h5/service/api/media/choose-video.js @@ -1,3 +1,5 @@ +import { fileToUrl } from '../file/util' + const { invokeCallbackHandler: invoke } = UniServiceJSBridge @@ -31,7 +33,7 @@ export function chooseVideo ({ videoInput.addEventListener('change', function (event) { const file = event.target.files[0] - const filePath = window.URL.createObjectURL(file) + const filePath = fileToUrl(file) invoke(callbackId, { errMsg: 'chooseVideo:ok', @@ -43,4 +45,4 @@ export function chooseVideo ({ }) videoInput.click() -} +} diff --git a/src/platforms/h5/service/api/network/download-file.js b/src/platforms/h5/service/api/network/download-file.js index fbfb4955..5c2d77c0 100644 --- a/src/platforms/h5/service/api/network/download-file.js +++ b/src/platforms/h5/service/api/network/download-file.js @@ -1,4 +1,4 @@ -import { blobToUrl } from '../file/util' +import { fileToUrl } from '../file/util' /** * 下载任务 */ @@ -57,7 +57,7 @@ export function downloadFile ({ invoke(callbackId, { errMsg: 'downloadFile:ok', statusCode, - tempFilePath: blobToUrl(blob) + tempFilePath: fileToUrl(blob) }) } xhr.onabort = function () { diff --git a/src/platforms/h5/service/api/network/upload-file.js b/src/platforms/h5/service/api/network/upload-file.js index cefcfb90..646eddb3 100644 --- a/src/platforms/h5/service/api/network/upload-file.js +++ b/src/platforms/h5/service/api/network/upload-file.js @@ -1,7 +1,4 @@ -import { - urlToBlob, - base64ToBlob -} from '../file/util' +import { urlToFile } from '../file/util' /** * 上传任务 */ @@ -52,32 +49,15 @@ export function uploadFile ({ invokeCallbackHandler: invoke } = UniServiceJSBridge var uploadTask = new UploadTask(null, callbackId) - // 暂时只支持blob和base64 - if (filePath.indexOf('blob:http') === 0) { - urlToBlob(filePath, upload, () => { - setTimeout(() => { - invoke(callbackId, { - errMsg: 'uploadFile:fail file error' - }) - }, 0) - }) - } else if (/^data:[a-z-]+\/[a-z-]+;base64,/.test(filePath)) { - upload(base64ToBlob(filePath)) - } else { - setTimeout(() => { - invoke(callbackId, { - errMsg: 'uploadFile:fail filePath error' - }) - }, 0) - } - function upload (blob) { + + function upload (file) { var xhr = new XMLHttpRequest() var form = new FormData() var timer Object.keys(formData).forEach(key => { form.append(key, formData[key]) }) - form.append(name, blob, `file-${Date.now()}`) + form.append(name, file, file.name || `file-${Date.now()}`) xhr.open('POST', url) Object.keys(header).forEach(key => { xhr.setRequestHeader(key, header[key]) @@ -131,5 +111,14 @@ export function uploadFile ({ }) } } + + urlToFile(filePath).then(upload).catch(() => { + setTimeout(() => { + invoke(callbackId, { + errMsg: 'uploadFile:fail file error' + }) + }, 0) + }) + return uploadTask } -- GitLab