import { hasOwn } from 'uni-shared' /** * 暂存的文件对象 */ const files = {} /** * 从url读取File * @param {string} url * @param {Promise} */ export function urlToFile (url) { var file = files[url] if (file) { return Promise.resolve(file) } if (/^data:[a-z-]+\/[a-z-]+;base64,/.test(url)) { return Promise.resolve(base64ToFile(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转File * @param {string} base64 * @return {File} */ export function base64ToFile (base64) { base64 = base64.split(',') var type = base64[0].match(/:(.*?);/)[1] var str = atob(base64[1]) var n = str.length var array = new Uint8Array(n) while (n--) { array[n] = str.charCodeAt(n) } return blobToFile(array, type) } /** * 简易获取扩展名 * @param {string} type * @return {string} */ function getExtname (type) { const extname = type.split('/')[1] return extname ? `.${extname}` : '' } /** * 简易获取文件名 * @param {*} url */ export function getFileName (url) { url = url.split('#')[0].split('?')[0] const array = url.split('/') return array[array.length - 1] } /** * blob转File * @param {Blob} blob * @param {string} type * @return {File} */ export function blobToFile (blob, type) { if (!(blob instanceof File)) { type = type || blob.type || '' const filename = `${Date.now()}${getExtname(type)}` try { blob = new File([blob], filename, { type }) } catch (error) { blob = blob instanceof Blob ? blob : new Blob([blob], { type }) blob.name = blob.name || filename } } return blob } /** * 从本地file或者blob对象创建url * @param {Blob|File} file * @return {string} */ export function fileToUrl (file) { for (const key in files) { if (hasOwn(files, key)) { const oldFile = files[key] if (oldFile === file) { return key } } } var url = (window.URL || window.webkitURL).createObjectURL(file) files[url] = file return url } export function getSameOriginUrl (url) { const a = document.createElement('a') a.href = url if (a.origin === location.origin) { return Promise.resolve(url) } return urlToFile(url).then(fileToUrl) } export function revokeObjectURL (url) { (window.URL || window.webkitURL).revokeObjectURL(url) delete files[url] }