press-ui
Version:
简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目
124 lines (117 loc) • 2.74 kB
JavaScript
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];
}