uniapp App端 预览图片并保存本地相册并且获得的是二进制流格式图片

本文介绍如何使用uniapp获取后端返回的二进制图片流,转换为base64路径以便预览,并结合image-tools插件实现本地保存。重点涉及arrayBuffer操作、base64转换和图片预览、保存到本地的功能。

使用背景:使用uniapp 开发App。后端返回的图片是二进制流格式,

使用插件:image-tools - DCloud 插件市场

 一、请求后端获取图片文件流

因为预览时,uni.previewImage 不支持base64路径,所以我们要把得到的base64转成path

// 获取arraybuffer格式数据
let res = await uni.request({
	method: "GET",
	url: /* 请求路径 */,
	params: {
	    id
	},
	responseType: "arraybuffer"   //只有text、arraybuffer两种
})

// 转成base64格式路径
const base64Src = 'data:image/png;base64,' + uni.arrayBufferToBase64(res.data);

// 通过 image-tools  中方法再将base64路径转为普通路径,用于预览
const path = await  base64ToPath(base64Src);

二、预览  

uni.previewImage({
	urls,    // 预览的图片路径数组["路径1","路径2",...]
	current,   //打开的图片在数组中的索引
	longPressActions: {   //长按图片出现的提示保存图片的弹框
	   itemList: ['保存图片'],
	   success: (data) => {
//使用 image-tools 再将path转为base64,因为以下保存方法需要base64格式
	        pathToBase64(urls[data.index]).then(base64 => {
	            this.saveImgToLocal(base64)  //保存方法
	        }).catch(error => {
	           console.error(error)
	        })
							
            console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
       },
       fail: (err) => {
           console.log(err.errMsg);
        }
    }
});

三、保存图片到本地相册

与图片预览结合使用。因为是App所以才使用如下方法。

saveImgToLocal(base64) {
				const bitmap = new plus.nativeObj.Bitmap('test');
				bitmap.loadBase64Data(
					base64,
					function() {
						const url = '_doc/' + new Date() + '.png'; // url建议用时间戳命名方式
						console.log('url:', url);
						bitmap.save(
							url, {
								overwrite: true // 是否覆盖
								// quality: 'quality'  // 图片清晰度
							},
							i => {
                                //保存图片到系统相册
								uni.saveImageToPhotosAlbum({
									filePath: url,
									success: function() {
										uni.showToast({
											title: '保存成功',
											icon: 'none'
										})
										bitmap.clear();
									}
								});
							},
							e => {
								uni.showToast({
									title: '保存失败',
									icon: 'none'
								})
								console.log(e);
								bitmap.clear();
							}
						);
					},
					e => {
						console.log('保存失败', e);
						bitmap.clear();
					}
				);

			},

UniAppAPP 解析后返回的文件流将其保存本地,可以通过以下步骤实现: ### 文件流的获取与解析 在请求后接口时,如果返回的是文件流(例如 PDF、Excel、Word 等),需要将请求的 `responseType` 设置为 `arraybuffer`,以确保能够正确获取二进制数据。UniApp 的 `uni.request` 提供了对 `arraybuffer` 的支持。 示例代码如下: ```javascript uni.request({ url: 'https://your-api.com/download-file', method: 'GET', responseType: 'arraybuffer', // 必须设置为 arraybuffer success: (res) => { if (res.statusCode === 200) { const arrayBuffer = res.data; // 调用保存文件的方法 saveFileToLocal(arrayBuffer); } } }); ``` ### 将文件保存本地获取到文件的 `arraybuffer` 后,可以使用 `uni.getFileSystemManager()` 获取文件系统管理器,通过 `writeFile` 方法将文件写入本地存储。 示例代码如下: ```javascript function saveFileToLocal(arrayBuffer) { const fs = uni.getFileSystemManager(); const filePath = `${uni.env.USER_DATA_PATH}/example.pdf`; // 保存路径 fs.writeFile({ filePath: filePath, data: arrayBuffer, encoding: 'binary', // 注意 encoding 设置为 binary success: () => { uni.showToast({ title: '文件保存成功', duration: 2000 }); console.log('文件已保存至:', filePath); }, fail: (err) => { uni.showToast({ title: '保存失败', icon: 'none', duration: 2000 }); console.error('文件保存失败:', err); } }); } ``` ### 获取保存后的文件路径打开文件 文件保存成功后,可以通过 `uni.openDocument` 打开文件(前提是设备上安装了能够打开该文件类型的程序)。 ```javascript uni.openDocument({ filePath: `${uni.env.USER_DATA_PATH}/example.pdf`, success: () => { console.log('文件打开成功'); }, fail: (err) => { uni.showToast({ title: '打开文件失败', icon: 'none', duration: 2000 }); console.error('打开文件失败:', err); } }); ``` ### 注意事项 1. **权限问题**:在 APP 操作文件系统时,需要确保应用具有写入权限。UniApp 默认在 `uni.env.USER_DATA_PATH` 路径下具有读写权限,因此建议将文件保存在此路径下。 2. **文件类型支持**:不同设备对文件类型的兼容性不同,`uni.openDocument` 可能无法在所有设备上打开所有类型的文件。 3. **大文件处理**:对于较大的文件流,处理时应注意内存占用问题,避免导致应用崩溃。 通过上述方法,可以在 UniAppAPP 解析后返回的文件流将其保存本地,同时支持打开文件的操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值