uni-app 头条小程序 保存图片到相册 base64 buffer

文章目录

核心代码

// 移除文件
export function removeSavedFile(filePath) {
	return new Promise((resolve, reject) => {
		uni.removeSavedFile({
			filePath,
			success: resolve,
			fail: reject,
		});
	})
}


// 保存图片到本地相册
export function saveImgPhotosAlbum(filePath) {
	return new Promise(async (resolve, reject) => {
		uni.saveImageToPhotosAlbum({
			filePath, // 暂不支持网络图片/本地图片地址,需与tt.downloadFile一起使用
			success: (res) => {
				tt.showToast({
					title: "成功保存到本地相册"
				});
				resolve({res,sucess:true})
			},
			fail: (err) => {
				console.log('saveImgPhotosAlbum-err', err)
				const obj = {
					'saveImageToPhotosAlbum:fail cancel':{
						text:'退出手机权限设置 / 取消保存图片(在选择保存路径时 未选择返回)'
					},
					'saveImageToPhotosAlbum:fail auth deny':{
						text:'没有权限'
					}
				}
				if(obj[err.errMsg]){ // 取消保存
					resolve({sucess:false,errMsg:obj[err.errMsg].text})
				}
				reject(err)
			}
		})
	})
}

// 获取图片文件 的临时地址
export function downloadFile(filePath) {
	return new Promise((resolve, reject) => {
		uni.downloadFile({ 
			url: filePath,
			header: { "content-type": "application/png"},
			success(res) {
				if (res.statusCode === 200) {
					resolve(res.tempFilePath)
				}
				reject(res)
			},
			fail: reject
		})
	})
}

// 提示
export function showToast(title, icon) {
	uni.showToast({title,icon})
}

// 写入图片文件
export function writeFileBase64(filePath, base64, type='base64') {
	const file = uni.getFileSystemManager()
	return new Promise(async (resolve, reject) => {

		// base64
		if(type === 'base64'){
			file.writeFile({
				filePath,
				encoding: 'base64',
				data: base64,
				success: resolve,
				fail: err=>{
					if(err.errMsg.indexOf('writeFile:fail permission denied') != -1){
						// 用户退出机来手机开启相册权限页面
						resolve(false)
					}
					console.log('writeFileBase64-err',err)
					reject(err)
				}
			})
			return
		}
		// buffer
		if(type === 'buffer'){
			const buffer = uni.base64ToArrayBuffer(base64)
			file.writeFile({
				filePath, 
				encoding: 'binary',
				data: buffer,
				success(res){
					console.log('写入成功',res)
					resolve(res)
				},
				fail:reject
			})
			return 
		}
	})
}

// 调用权限提示
export function openSetting(obj) {
	return new Promise((resolve, reject) => {
		uni.openSetting({
			success: res=>{
				console.log('res',res)
				resolve(res)
			},
			fail: err=>{
				console.log('openSetting',err)
				reject(err)
			},
		});
	})
}


export function showModal(obj) {
	return new Promise((resolve, reject) => {
		uni.showModal({
			title: '提示',
			content: '提示内容',
			showCancel: false,
			success: () => {
				resolve()
			},
			fail: reject,
			...obj
		})
	})
}

// 判断用户是否有保存到
相册权限
// 如果没有权限会自动提示获取权限
export function authorizeAlbum() {
	const obj = {
		'ok':{text:'成功',bool: true},
		'auth deny':{text:'没有权限',bool: false}
	}
	return new Promise((resolve, reject) => {
		uni.authorize({
			scope: 'scope.album',
			success(res) {
				const val = obj[res.data['scope.album']]
				if (val) { resolve({is:val.bool,res}) }
				reject(res)
			},
			fail(err) {
				const val = obj[err.data['scope.album']]
				if (val) { resolve({is:val.bool,err}) }
				reject(err)
			}
		})
	})
}

// 保存图片到本地相册 实现
export async function saveImgAlbum(base64){
	let result = {save:true}
	
	// 文件路径
	let fileName = new Date().valueOf();
	// tt.env.USER_DATA_PATH 头条文件路径
	const filePath = tt.env.USER_DATA_PATH + '/'+ fileName +'.png'
	
	// 获取用户权限
	const isAlbum = await authorizeAlbum()
	if(!isAlbum.is){
		await showModal({content: '需要您授权保存相册'})
		await openSetting() //调起手机授权
	}
	
	// bug 正式版 
	// // ttfile://user/1612418287735.png 不在配置的域名白名单中;需要在开发者平台配置或者点击详情勾选不校验选项
	// // 写入图片 
	// const isWrite = await writeFileBase64(filePath, base64)
	// if(!isWrite){ // 没有权限 写入失败
	// 	showToast('保存失败!','fail')
	// 	return {save:false,text:'没有权限 写入失败'}
	// }
	// // 保存到本地 获取临时路径
	// const path = await downloadFile(filePath)
	
	// 直接上传到白名单中的服务器 然后获取图片路径
	const path = await upTempImg({base64})
	
	// 保存到相册
	const isSave = await saveImgPhotosAlbum(path)
	if(!isSave.sucess){ // 保存失败
		console.log('isSave',isSave)
		showToast(isSave.errMsg ,'fail')
		result = {save:false, text:isSave.errMsg}
	}
	
	// 移除临时文件
	await removeSavedFile(filePath)
	
	return result
}

调用

// 后台生成的base64位码 接口
const {data} = await createQRCode() 
const save = await saveImgAlbum(data.data.QRCode)
console.log('save',save)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值