临时路径转base64 转file

4 篇文章 0 订阅
3 篇文章 0 订阅

临时路径转base64

使用插件js直接转换方便使用

下面是插件js

function getLocalFilePath(path) {
    if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
        return path
    }
    if (path.indexOf('file://') === 0) {
        return path
    }
    if (path.indexOf('/storage/emulated/0/') === 0) {
        return path
    }
    if (path.indexOf('/') === 0) {
        var localFilePath = plus.io.convertAbsoluteFileSystem(path)
        if (localFilePath !== path) {
            return localFilePath
        } else {
            path = path.substr(1)
        }
    }
    return '_www/' + path
}

function dataUrlToBase64(str) {
    var array = str.split(',')
    return array[array.length - 1]
}

var index = 0
function getNewFileId() {
    return Date.now() + String(index++)
}

function biggerThan(v1, v2) {
    var v1Array = v1.split('.')
    var v2Array = v2.split('.')
    var update = false
    for (var index = 0; index < v2Array.length; index++) {
        var diff = v1Array[index] - v2Array[index]
        if (diff !== 0) {
            update = diff > 0
            break
        }
    }
    return update
}

export function pathToBase64(path) {
    return new Promise(function(resolve, reject) {
        if (typeof window === 'object' && 'document' in window) {
            if (typeof FileReader === 'function') {
                var xhr = new XMLHttpRequest()
                xhr.open('GET', path, true)
                xhr.responseType = 'blob'
                xhr.onload = function() {
                    if (this.status === 200) {
                        let fileReader = new FileReader()
                        fileReader.onload = function(e) {
                            resolve(e.target.result)
                        }
                        fileReader.onerror = reject
                        fileReader.readAsDataURL(this.response)
                    }
                }
                xhr.onerror = reject
                xhr.send()
                return
            }
            var canvas = document.createElement('canvas')
            var c2x = canvas.getContext('2d')
            var img = new Image
            img.onload = function() {
                canvas.width = img.width
                canvas.height = img.height
                c2x.drawImage(img, 0, 0)
                resolve(canvas.toDataURL())
                canvas.height = canvas.width = 0
            }
            img.onerror = reject
            img.src = path
            return
        }
        if (typeof plus === 'object') {
            plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
                entry.file(function(file) {
                    var fileReader = new plus.io.FileReader()
                    fileReader.onload = function(data) {
                        resolve(data.target.result)
                    }
                    fileReader.onerror = function(error) {
                        reject(error)
                    }
                    fileReader.readAsDataURL(file)
                }, function(error) {
                    reject(error)
                })
            }, function(error) {
                reject(error)
            })
            return
        }
        if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
            wx.getFileSystemManager().readFile({
                filePath: path,
                encoding: 'base64',
                success: function(res) {
                    resolve('data:image/png;base64,' + res.data)
                },
                fail: function(error) {
                    reject(error)
                }
            })
            return
        }
        reject(new Error('not support'))
    })
}

export function base64ToPath(base64) {
    return new Promise(function(resolve, reject) {
        if (typeof window === 'object' && 'document' in window) {
            base64 = base64.split(',')
            var type = base64[0].match(/:(.*?);/)[1]
            var str = atob(base64[1])
            var n = str.length
            var array = new Uint8Array(n)
            while (n--) {
                array[n] = str.charCodeAt(n)
            }
            return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type })))
        }
        var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
        if (extName) {
            extName = extName[1]
        } else {
            reject(new Error('base64 error'))
        }
        var fileName = getNewFileId() + '.' + extName
        if (typeof plus === 'object') {
            var basePath = '_doc'
            var dirPath = 'uniapp_temp'
            var filePath = basePath + '/' + dirPath + '/' + fileName
            if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
                plus.io.resolveLocalFileSystemURL(basePath, function(entry) {
                    entry.getDirectory(dirPath, {
                        create: true,
                        exclusive: false,
                    }, function(entry) {
                        entry.getFile(fileName, {
                            create: true,
                            exclusive: false,
                        }, function(entry) {
                            entry.createWriter(function(writer) {
                                writer.onwrite = function() {
                                    resolve(filePath)
                                }
                                writer.onerror = reject
                                writer.seek(0)
                                writer.writeAsBinary(dataUrlToBase64(base64))
                            }, reject)
                        }, reject)
                    }, reject)
                }, reject)
                return
            }
            var bitmap = new plus.nativeObj.Bitmap(fileName)
            bitmap.loadBase64Data(base64, function() {
                bitmap.save(filePath, {}, function() {
                    bitmap.clear()
                    resolve(filePath)
                }, function(error) {
                    bitmap.clear()
                    reject(error)
                })
            }, function(error) {
                bitmap.clear()
                reject(error)
            })
            return
        }
        if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
            var filePath = wx.env.USER_DATA_PATH + '/' + fileName
            wx.getFileSystemManager().writeFile({
                filePath: filePath,
                data: dataUrlToBase64(base64),
                encoding: 'base64',
                success: function() {
                    resolve(filePath)
                },
                fail: function(error) {
                    reject(error)
                }
            })
            return
        }
        reject(new Error('not support'))
    })
}

插件js的使用

pathToBase64
从图像路径转换为base64,uni-app、微信小程序和5+APP使用的路径不支持网络路径,如果是网络路径需要先使用下载API下载下来。

pathToBase64(path)
  .then(base64 => {
    console.log(base64)
  })
  .catch(error => {
    console.error(error)
  })

将图像base64保存为文件,返回文件路径。

base64ToPath(base64)
  .then(path => {
    console.log(path)
  })
  .catch(error => {
    console.error(error)
  })

可以利用promise来串行和并行的执行多个任务

// 并行
Promise.all(paths.map(path => pathToBase64(path)))
  .then(res => {
    console.log(res)
    // [base64, base64...]
  })
  .catch(error => {
    console.error(error)
  })
// 串行
paths.reduce((promise, path) => promise.then(res => pathToBase64(path).then(base64 => (res.push(base64), res))), Promise.resolve([]))
  .then(res => {
    console.log(res)
    // [base64, base64...]
  })
  .catch(error => {
    console.error(error)
  })

base64转file

base64转成file具体代码

base64ToFile(base64, fileName) {
			      // 将base64按照 , 进行分割 将前缀  与后续内容分隔开
			      let data = base64.split(',');
			      // 利用正则表达式 从前缀中获取图片的类型信息(image/png、image/jpeg、image/webp等)
			      let type = data[0].match(/:(.*?);/)[1];
			      // 从图片的类型信息中 获取具体的文件格式后缀(png、jpeg、webp)
			      let suffix = type.split('/')[1];
			      // 使用atob()对base64数据进行解码  结果是一个文件数据流 以字符串的格式输出
			      const bstr = window.atob(data[1]);
			      // 获取解码结果字符串的长度
			      let n = bstr.length
			      // 根据解码结果字符串的长度创建一个等长的整形数字数组
			      // 但在创建时 所有元素初始值都为 0
			      const u8arr = new Uint8Array(n)
			      // 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
			      while (n--) {
			        // charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
			        u8arr[n] = bstr.charCodeAt(n)
			      }
			      // 利用构造函数创建File文件对象
			      // new File(bits, name, options)
			      const file =  new File([u8arr], `${fileName}.${suffix}`, {
			        type: type
			      })
			      // 将File文件对象返回给方法的调用者
			      return file;
			  },
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Base64 编码的字符串换为 Word 文件,可以按照以下步骤进行: 1. 将 Base64 编码的字符串解码为二进制数据。 2. 将二进制数据写入一个临时文件中。 3. 使用 Word 应用程序对象打开该临时文件。 4. 将该文件另存为 Word 格式。 下面是一个 Python 代码示例,实现了将 Base64 编码的字符串换为 Word 文件的功能: ```python import base64 import tempfile import win32com.client as win32 def base64_to_word(base64_str, output_path): # 解码Base64字符串为二进制数据 data = base64.b64decode(base64_str) # 将二进制数据写入临时文件 with tempfile.NamedTemporaryFile(delete=False) as tmp: tmp.write(data) tmp.flush() # 使用Word应用程序对象打开临时文件 word = win32.gencache.EnsureDispatch('Word.Application') doc = word.Documents.Open(tmp.name) # 另存为Word格式 doc.SaveAs(output_path, FileFormat=16) # 关闭Word文档和应用程序对象 doc.Close() word.Quit() ``` 这个函数接受两个参数:Base64 编码的字符串和输出路径。它将 Base64 编码的字符串解码为二进制数据,并将其写入一个临时文件中。然后,它使用 Word 应用程序对象打开该临时文件,并将其另存为 Word 格式。最后,它关闭 Word 文档和应用程序对象。 使用示例: ```python base64_str = "SGVsbG8gV29ybGQh" output_path = "hello.docx" base64_to_word(base64_str, output_path) ``` 这个示例将 Base64 编码的字符串解码为二进制数据,并将其写入名为 `tmpXXXXX` 的临时文件中。然后,它使用 Word 应用程序对象打开该临时文件,并将其另存为 Word 格式到 `hello.docx` 文件中。最后,它关闭 Word 文档和应用程序对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值