JS 中 File、blob、base64 之间的相互转换

文章详细介绍了在JavaScript中如何将File对象转换为Blob、Base64字符串,以及Blob和Base64如何转换回File对象的函数实现,包括读取文件数据、处理数据类型和创建新文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FileToBlob

/**
 * File 转 Blob
 * @param file     {File}   file
 * @return {Promise<Blob>}
 */
function FileToBlob(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    reader.addEventListener('load', (evt) => {
      const isObj = typeof evt.target.result === 'object';
      const blob = isObj ? new Blob([evt.target.result]) : evt.target.result;
      resolve(blob);
    });
    reader.addEventListener('error', reject);
    reader.readAsArrayBuffer(file);
  });
}

FileToBase64

/**
 * File 转 Base64
 * @param file     {File}   file
 * @return {Promise<String>}
 */
function FileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    reader.addEventListener('load', (evt) => resolve(evt.target.result));
    reader.addEventListener('error', reject);
    reader.readAsDataURL(file);
  });
}

BlobToFile

/**
 * Blob 转 File
 * @param blob     {Blob}   blob
 * @param fileName {String} 文件名
 * @param mimeType {String} 文件类型
 * @return {File}
 */
function BlobToFile(blob, fileName, mimeType) {
  return new File([blob], fileName, { type: mimeType});
}

BlobToBase64

/**
 * Blob 转 Base64
 * @param blob     {Blob}   blob
 * @return {Promise<String>}
 */
function BlobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    reader.addEventListener('load', (evt) => resolve(evt.target.result));
    reader.addEventListener('error', reject);
    reader.readAsDataURL(blob);
  });
}

Base64ToFile

/**
 * Base64 转 File
 * @param base64   {Base64} base64
 * @param fileName {String} 文件名
 * @param mimeType {String} 文件类型
 * @return {File}
 */
function Base64ToFile(base64, fileName, mimeType) {
  const arr = base64.split(',');
  const defaultMimeType = arr[0].match(/:(.*?);/)[1];
  const suffix = defaultMimeType.split('/')[1];
  const binary = atob(arr[1]);
  const array = [];
  for (let i = 0; i < binary.length; i += 1) {
    array.push(binary.charCodeAt(i));
  }

  return new File(
    [new Uint8Array(array)],
    fileName || `${new Date().getTime()}.${suffix}`,
    { type: mimeType || defaultMimeType },
  );
}

Base64ToBlob

/**
 * Base64 转 Blob
 * @param blob     {Base64} Base64
 * @param mimeType {String} 文件类型
 * @return {Blob}
 */
function Base64ToBlob(base64, mimeType) {
  const arr = base64.split(',');
  const defaultMimeType = arr[0].match(/:(.*?);/)[1];
  const binary = atob(arr[1]);
  const array = [];
  for (let i = 0; i < binary.length; i += 1) {
    array.push(binary.charCodeAt(i));
  }

  return new Blob([new Uint8Array(array)], { type: mimeType || defaultMimeType });
}

Uint8ArrayToBase64

/**
 * Uint8 转 Blob
 * @param blob     	{Uint8Array} 	u8Arr
 * @param type 		{String} 		文件类型
 * @return {Blob}
 */
function Uint8ToBase64(u8Arr, type = 'image/png') {
  const CHUNK_SIZE = 0x8000;
  const length = u8Arr.length;
  let index = 0;
  let result = '';
  let slice;
  while (index < length) {
    slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
    result += String.fromCharCode.apply(null, slice);
    index += CHUNK_SIZE;
  }
  return 'data:' + type.toLowerCase() + ';base64, ' + btoa(result);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值