UNPKG

press-ui

Version:

简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目

124 lines (117 loc) 2.74 kB
import { hasOwn } from './object-base'; /** * 暂存的文件对象 */ const files = {}; /** * 从url读取File * @param {string} url * @param {boolean} local * @param {Promise} */ export function urlToFile(url, local) { const file = files[url]; if (file) { return Promise.resolve(file); } if (/^data:[a-z-]+\/[a-z-]+;base64,/.test(url)) { return Promise.resolve(base64ToFile(url)); } if (local) { return Promise.reject(new Error('not find')); } return new Promise((resolve, reject) => { const 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) { const base64Array = base64.split(','); const type = base64Array[0]?.match(/:(.*?);/)?.[1] || ''; const str = atob(base64[1]); let n = str.length; const array = new Uint8Array(n); while (n) { n -= 1; 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; } } } const 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]; }