sqlite数据库存储图片和视频资源

	现象:手机uni.chooseImage图片和uni.chooseVideo上传视频资源返回的临时的路劲,把这个临时的路径存储到sqlite数据库中;这个时候如果退出手机杀掉手机app的进程然后重新打开app的时候,调用查询的接口反选图片的时候会出现图片无法显示的问题;视频资源则是正常的。
	产生现象的原因:是因为杀掉手机进程的时候上传的img临时文件会丢失掉;
	解决的办法:
	1.先调用uni.chooseImage方法返回临时的路劲;
				uni.chooseImage({
    
    
					count: 9, //默认9
					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
					sourceType: [ 'camera' , 'album'], //从相册选择
					fileType: 'image',
					success: function(res) {
    
    }
				})
	2.调用pathToBase64的方法将临时的url地址转换成base64的存储在sqlite数据库中;
	3.反选数据,使用base64ToPath方法将图片的base64的数据转换成地址;
	4.在此过程中,我们把base64存入数据库的之后再取回base64的数据,会出现数据库将+变成了空格和换行;
	5.调用正则表达式处理数据 item = item.replace(/\s/g,"+") //将空格转换成+号

附上base64与url质检相互转换的方法:
新建image-tools.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'))
    })
}
	以上本人亲测有效,可以解决图片资源和video资源保存sqlite数据库的问题,欢迎大家多多指点,有更好的方法可以一起交流

猜你喜欢

转载自blog.csdn.net/qqjuanqq/article/details/130401626