Skip to content

File

通过用户选择文件后从input[type=file]元素中获取的一个文件对象

属性描述
name文件的名称,不包括路径
size文件的大小(字节)
type文件的类型(MIME)如 'image/png'、'text/plain'等
lastModified文件最后的修改时间(Date)

Blob

Blob(Binary large object):二进制大型对象
blob常常用是数据库用来存储二进制文件的字段类型,如(图片、音频、视频、文档等)

Base64

一种基于64个可打印字符来表示二进制数据的方法,用于在文本协议中传递二进制数据

十六进制Hex

十六进制编码(base16),将字节数据中的每4个bit使用数字(0-9)、字母(A-F)共16个字符数等效表示。其中一个字节有8个bit,所以一个字节会被编码成2个hex字符

file 转 blob

文件流转blob

javascript
/**
 * file转blob
 * @param file   {File} 文件
 * @returns blob {Blob} blob
 */

function file2Blob (file) {
    return window.URL.createObjectURL(file)
}

blob 转 file

blob转file

javascript
/**
 * blob转file
 * @param blob       {Blob}   blob
 * @param fileName   {String} 文件名
 * @param mimeType   {String} 文件类型
 * @returns file     {File}   文件
 */

function blob2File (blob, fileName, mimeType) {
    const file = new File([blob], fileName, { type: mimeType })
    return file
}

mimeType有如常见类型:

  • image/jpeg:jpeg格式的图片
  • image/jpg:jpg格式的图片
  • image/png:png格式的图片
  • image/gif:gif格式的图片
  • audio/mpeg: mp3格式的音频文件
  • video/mp4:mp4格式的视频文件
  • application/pdf:pdf文档
  • application/json:json数据
  • text/plain:纯文本文件
  • text/html:html文档

file 转 base64

文件流转base64

javascript
/**
 * file转base64
 * @param file       {File}    文件
 * @returns promise  {Promise} 返回base64
 */
 
function file2Base64 (file) {
    return new Promise((resolve, reject) => {
        // 使用FileReader对象异步读取文件的内容
        const reader = new FileReader()
        let readerResult = ''
        
        // 开始读取
        reader.readAsDataURL(file)
        
        // 操作完成时触发
        reader.onload = function () {
            readerResult = reader.result
        }
        
        // 读取操作发生错误时触发
        reader.onerror = function (error) {
            reject(error)
        }
        
        // 读取操作结束时触发(要么成功、要么失败)
        reader.onloadend = function () {
            resolve(readerResult)
        }
    })
}

base64 转 file

base64 转 文件流,先获取文件的类型和后缀,然后通过base64字符串转blob,最后用new File创建一个File文件流对象

javascript
/**
 * base64转file
 * @param base64     {String} base64
 * @param fileName   {String} 文件名 
 * @returns file     {File}   文件
 */
 
function base642File (base64, fileName = 'file') {
    const arr = base64.split(',')
    
    // 文件类型
    const mime = arr[0].match(/:(.*?);/)[1]
    
    // 文件后缀
    const suffix = mime.split('/')[1]
    
    // base64解码
    const bstr = atob(arr[1])
    
    let n = bstr.length
    
    // 一个8位无符号整型数组
    let u8arr = new Unit8Array(n)
    
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    
    return new File([u8arr], `${fileName}.${suffix}`, {
        type: mime
    })
}

base64 转 hex

base64 转 hex(十六进制),先使用atob函数将base64字符串解码成二进制数据,再通过toString(16)转成十六进制

javascript
/**
 * base64转hex
 * @param base64     {String} base64 
 * @returns hex      {String} hex十六进制
 */
 
function base2ToHex (base64) {
    const arr = base64.split(',')
    
    // 对base64编码的字符串进行解码
    const raw = atob(arr[1])
    
    let HEX = ''
    
    for (let i = 0; i < raw.length; i++) {
        // charCodeAt()得到二进制,二进制通过toString(16)转成十六进制
        const _hex = raw.charCodeAt(i).toString(16)
        HEX += (_hex.length === 2 ? _hex : '0' + _hex)
    }
    return HEX.toUpperCase()
}

hex 转 file

javascript
/**
 * base64转hex
 * @param hex          {String} hex十六进制 
 * @param fileName     {String} 文件名 
 * @param mimeType     {String} 文件类型
 * @returns hex        {String} hex十六进制
 */
 
function hex2File (hexString, fileName, mimeType) {
    // 将十六进制字符串转成字节数组
    const bytes = hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))
    
    // 从字节数组创建一个Blob对象
    const blob = new Blob([new UintBArray(bytes)], { type: mimeType })
    
    // 从Blob创建一个File对象
    const file = new File([blob], fileName, { type: mimeType })
    
    return file
}

上次更新于: