UNPKG

@ivujs/i-utils

Version:

前端模块化 JavaScript 工具库

345 lines (341 loc) 9.86 kB
'use strict'; var index = require('../validate/index.cjs'); /** * @module 文件 */ /* 文件信息处理 */ /** * 格式化文件大小自动转为 B,KB,MB,GB * @param {number} size 文件的大小,单位byte字节 * @returns {string} 返回格式化后的字符串 */ function formatFileSize(size) { if (index.isEmpty(size)) return "0B"; if (size < 1024) { return size + "B"; } else if (size < 1024 * 1024) { return (size / 1024).toFixed(2) + "KB"; } else if (size < 1024 * 1024 * 1024) { return (size / (1024 * 1024)).toFixed(2) + "MB"; } else { return (size / (1024 * 1024 * 1024)).toFixed(2) + "GB"; } } /** * 获得文件名称 * @param {string} fileName 文件的全名称,例如:测试图片.jpg * @returns {string} 返回文件的名称 */ function getFileName(fileName) { if (index.isEmpty(fileName)) return; return fileName.substring(0, fileName.lastIndexOf(".")); } /** * 获得文件后缀名 * @param {string} value 文件地址路径或者文件全名称,例如:http://xxx.com/mytest.jpg,测试图片.jpg * @returns {string} 返回文件后缀名 */ function getFileSuffix(value) { if (index.isEmpty(value)) return; return value.substring(value.lastIndexOf(".") + 1).toLowerCase(); } /* 文件转换 */ /** * file转blob * @param {File} file file文件 * @returns {Promise} 返回Promise的blob */ function fileToBlob(file) { return new Promise((resolve, reject) => { // 读取解析文件 const reader = new FileReader(); reader.readAsArrayBuffer(file); // 加载成功 reader.onload = (e) => { const result = e.target?.result; const blob = new Blob([result], { type: file.type }); resolve(blob); }; // 加载失败 reader.onerror = function (err) { console.error(err); reject(err); }; }); } /** * file转base64 * @param {File} file file文件 * @returns {Promise} 返回Promise的base64 */ function fileToBase64(file) { return new Promise((resolve, reject) => { // 读取解析文件 const reader = new FileReader(); reader.readAsDataURL(file); // 加载成功 reader.onload = function (e) { const result = e.target?.result; resolve(result); }; // 加载失败 reader.onerror = function (err) { console.error(err); reject(err); }; }); } /** * file转url * @description 适用于本地上传图片并预览,需要注意 URL.revokeObjectURL(file) 内存释放 * @param {File} file file文件 * @returns {Promise} 返回Promise的url */ function fileToUrl(file) { return new Promise((resolve, reject) => { try { const url = URL.createObjectURL(file); resolve(url); } catch (err) { // 捕捉异常 console.error(err); reject(err); } }); } /** * url赚file * @param {string} url url地址 * @returns {Promise} 返回Promise的file */ function urlToFile(url) { return new Promise((resolve, reject) => { try { window && window.fetch(url).then((res) => { if (res.status === 200) { res.blob().then((blob) => { blobToFile(blob).then((file) => { resolve(file); }); }); } }); } catch (err) { console.error(err); reject(err); } }); } /** * blob转file * @param {Blob} blob blob数据 * @param {string} fileName 文件名称,默认以时间戳命名 * @returns {Promise} 返回Promise的file */ function blobToFile(blob, fileName = String(Date.now())) { return new Promise((resolve, reject) => { try { const mime = blob.type; const fileSuffix = mime.split("/")[1]; const file = new File([blob], `${Date.now()}.${fileSuffix}`, { type: mime, lastModified: Date.now(), }); resolve(file); } catch (err) { // 捕捉异常 console.error(err); reject(err); } }); } /** * blob转文本 * @param {Blob} blob blob数据 * @returns {Promise} 返回Promise的文本 */ function blobToText(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function (e) { const result = e.target?.result; resolve(result); }; reader.onerror = function (error) { reject(error); }; reader.readAsText(blob); }); } /** * blob转base64 * @param {Blob} blob blob数据 * @returns {Promise} 返回Promise的base64 */ function blobToBase64(blob) { return new Promise((resolve, reject) => { // 读取解析文件 const reader = new FileReader(); reader.readAsDataURL(blob); // 加载成功 reader.onload = function (e) { const result = e.target?.result; resolve(result); }; // 加载失败 reader.onerror = function (err) { console.error(err); reject(err); }; }); } /** * base64转file * @param {string} base64 base64数据 * @param {string} fileName 文件名称,默认以时间戳命名 * @returns {Promise} 返回Promise的file */ function base64ToFile(base64, fileName = String(Date.now())) { return new Promise((resolve, reject) => { try { const arr = base64.split(","); const mimeMatch = arr[0] ? arr[0].match(/:(.+?);/) : null; const mime = mimeMatch ? mimeMatch[1] : ""; const fileSuffix = mime.split("/")[1]; const bstr = window.atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } resolve(new File([u8arr], `${fileName}.${fileSuffix}`, { type: mime })); } catch (err) { // 捕捉异常 console.error(err); reject(err); } }); } /** * base64转成blob * @param {string} base64 base64数据 * @returns {Promise} 返回Promise的blob */ function base64ToBlob(base64) { return new Promise((resolve, reject) => { try { const arr = base64.split(","); const mimeMatch = arr[0] ? arr[0].match(/:(.+?);/) : null; const mime = mimeMatch ? mimeMatch[1] : ""; const bstr = window.atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } resolve(new Blob([u8arr], { type: mime })); } catch (err) { // 捕捉异常 console.error(err); reject(err); } }); } /** * 图片url转base64 * @param {string} imgUrl 图片url地址 * @returns {Promise} 返回Promise的base64 */ function urlToBase64(imgUrl) { return new Promise((resolve, reject) => { // 设置图片 const img = new Image(); img.src = imgUrl; // 加载成功 img.onload = function () { // 画图 const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); canvas.width = img.width; canvas.height = img.height; if (context) { context.drawImage(img, 0, 0, img.width, img.height); } // 转为base64 const base64 = canvas.toDataURL("image/png"); resolve(base64); }; // 加载失败 img.onerror = function (err) { console.error(err); reject(err); }; }); } /* 下载文件 */ /** * 下载blob格式的文件 * @param {Blob} blob blob数据 * @param {string} fileName 下载的文件名,不写后缀名则默认为原文件类型 */ function downloadBlobFile(blob, fileName) { try { const objUrl = window.URL.createObjectURL(blob); const link = window.document.createElement("a"); link.download = fileName; link.href = objUrl; link.click(); URL.revokeObjectURL(objUrl); } catch (error) { console.error(error); } } /** * 通过文件url地址下载 * @param {string} fileUrl url文件地址 * @param {string} fileName 下载的文件名,不写后缀名则默认为原文件类型 */ function downloadFileUrl(fileUrl, fileName) { try { const link = window.document.createElement("a"); link.download = fileName; link.href = fileUrl; link.target = "_blank"; // 生成节点点击 window.document.body.appendChild(link); link.click(); // 点击后移除节点 window.document.body.removeChild(link); } catch (error) { console.error(error); } } exports.base64ToBlob = base64ToBlob; exports.base64ToFile = base64ToFile; exports.blobToBase64 = blobToBase64; exports.blobToFile = blobToFile; exports.blobToText = blobToText; exports.downloadBlobFile = downloadBlobFile; exports.downloadFileUrl = downloadFileUrl; exports.fileToBase64 = fileToBase64; exports.fileToBlob = fileToBlob; exports.fileToUrl = fileToUrl; exports.formatFileSize = formatFileSize; exports.getFileName = getFileName; exports.getFileSuffix = getFileSuffix; exports.urlToBase64 = urlToBase64; exports.urlToFile = urlToFile;