uniapp app 端base64转临时路径 并自定义下载文件名称

752 阅读2分钟
修改文件名称
RenameFile(oldFilePath, newFileName) {
        plus.io.resolveLocalFileSystemURL(oldFilePath, entry => {
                console.log(entry)
                entry.getParent(_oldFile => {
                        entry.moveTo(_oldFile, '/' + newFileName, newFilePath => {
                                uni.openDocument({
                                        filePath: newFilePath.fullPath,
                                        success: function(FileRes) {
                                                uni.hideLoading()
                                                console.log('打开成功');
                                        }
                                });
                        })
                })
        })
},

生成pdf

<script lang="renderjs" module="canvasImage">
	import html2Canvas from 'html2canvas'
	import {
		jsPDF
	} from 'jspdf'
	export default {
		data() {
			return {
				loading: true
			}
		},
		methods: {
			// 生成图片需要调用的方法
			generateImage(e, ownerFun) {
				return new Promise((resolve, reject) => {
					var shareContent = document.getElementById('content');
					var width = shareContent.offsetWidth / 4;
					var height = shareContent.offsetHeight / 4;
					html2Canvas(document.getElementById('content'), {
						dpi: 900,
						scrolly: 0,
						// width:eleW,//生成后的宽度
						// height:eleH,//生成后的高度
						scrollx: -10,
						useCORS: true, //允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。

						// backgroundColor: null //避免图片有白色边框
					}).then((canvas) => {
						setTimeout(() => {
							var context = canvas.getContext('2d');
							context.mozImageSmoothingEnabled = false;
							context.webkitImageSmoothingEnabled = false;
							context.msImageSmoothingEnabled = false;
							context.imageSmoothingEnabled = false;
							var pageData = canvas.toDataURL('image/jpeg', 1.0);
							// resolve(pageData)
							var img = new Image();
							img.src = pageData
							img.onload = () => {
								// 获取dom高度、宽度
								img.width = img.width / 2;
								img.height = img.height / 2;
								// console.log(img.width, '------ img.width');
								// console.log(img.height, '------img.height');
								img.style.transform = 'scale(0.5)';
								if (width > height) {
									// 此可以根据打印的大小进行自动调节
									// eslint-disable-next-line
									var pdf = new jsPDF('l', 'mm', [width * 0.505, height *
										0.545
									]);
								} else {
									// eslint-disable-next-line
									var pdf = new jsPDF('p', 'mm', [width * 0.505, height *
										0.545
									]);
								}
								pdf.addImage(pageData, 'jpeg', 0, 0, width * 0.505, height *
									0.545);
								var url = pdf.output("datauristring");
								resolve(url)
							};
						}, 500);

					}).catch((r) => {
						console.log(r);
					})
				})
			},
			async save(e, ownerFun) {
				this.$ownerInstance.callMethod('startSave', true)
				let img = await this.generateImage().then()
				ownerFun.callMethod('receiveRenderData', img)
			},
		},
	}
</script>

base64转临时路径

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'))
    })
}