UNPKG

blob-url-file

Version:

transformation functions of file/blob/base64

155 lines (142 loc) 3.94 kB
function request(config) { return new Promise((resolve, reject) => { const { url, data = {}, method="GET"} = config; if (!config.url) { reject(new Error('Url 不存在')); } const req = new FormData(); for (let k in data) { req.append(k, data[k]); } const request = new XMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState === 4) { if (request.status === 200) { resolve(request.response); } else { reject(new Error('请求不到'+ url + ' 的文件')); } } } request.onerror = function() { reject(new Error('请求不到'+ url + ' 的文件')); } request.open(method.toUpperCase(), url); request.responseType = 'blob'; request.send(req); }); } // blob to base64 const blobToBase64 = function (blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => { resolve(e.target.result); }; reader.readAsDataURL(blob); reader.onerror = () => { reject(new Error("文件流异常")); }; }); }; // url 非图片 const urlToBase64 = function (url) { const list = url.split(","); // const type = list[0].match(/:(.*?);/)[1]; const base64 = atob(list[1]); return base64; }; const urlToBlob = function (url) { const list = url.split(","); const contentType = list[0].match(/:(.*?);/)[1]; const b64Data = list[1]; return base64ToBlob({ b64Data, contentType }); }; // base64 to blob const base64ToBlob = function ({ b64Data = "", contentType = "", sliceSize = 512, name = "", }) { return new Promise((resolve, reject) => { try { const byteCharts = atob(b64Data); const byteArray = []; for (let offset = 0; offset < byteCharts.length; offset += sliceSize) { const slice = byteCharts.slice(offset, offset + sliceSize); const byteNumbers = []; for (let i = 0; i < slice.length; i++) { byteNumbers.push(slice.charCodeAt(i)); } byteArray.push(new Uint8Array(byteNumbers)); } let result = new Blob(byteArray, { type: contentType }); result = Object.assign(result, { preview: URL.createObjectURL(result), name, }); resolve(result); } catch (e) { reject(new Error("base64 错误")); } }); }; const isValidString = (str) => { if (!str) { return false; } if (typeof str !== "string") { return false; } return true; }; // url to base64 图片法 const imageUrlToBase64 = function (url) { return new Promise((resolve, reject) => { const image = new Image(); image.onload = function () { const canvas = document.createElement("canvas"); canvas.width = this.naturalWidth; canvas.height = this.naturalHeight; canvas.getContext("2d").drawImage(image, 0, 0); resolve(canvas.toDataURL()); }; image.setAttribute("crossOrigin", "Anonymous"); image.src = url; image.onerror = () => { reject(new Error("图片流异常")); }; }); }; // fileUrl to blob const fileUrlToUrl = function (fileUrl) { return new Promise((resolve, reject) => { try { request({ url: fileUrl }) .then((r) => { resolve(URL.createObjectURL(r)); }) .catch((e) => { reject(e); }); } catch (error) { reject(new Error("请求不到文件")); } }); }; const downloadFile = async function (fileUrl, name) { return fileUrlToUrl(fileUrl).then(url => { toDownload(url, name); }).catch((e) => e.message || e) }; const toDownload = (url, name) => { const a = document.createElement("a"); a.href = url; a.download = name; a.click(); a.remove(); }; export { blobToBase64, urlToBase64, urlToBlob, base64ToBlob, fileUrlToUrl, downloadFile, toDownload }