uniapp 小程序获取后端的二进制 保存到手机相册

uniapp 小程序获取后端的二进制流显示图片

以下代码演示了如何使用 `uni.request` 发起 GET 请求,并处理返回的文件流数据。

复制代码
uni.request({
      url: "https://xxx.xxx.cn/bank/file/xxx/aeb9beb4fb2444ff80d47ed11c18b991.jpg",
      method: 'GET',
      responseType: 'arraybuffer',
      header:{
        Authorization:"Bearer e2589fc8-8748-481b-8ec4-c63df33e4371"
      },
      success: res => {
        let datas = res.data;
        this.codeUrl =  'data:image/png;base64,'+uni.arrayBufferToBase64(datas);
      },
    });

主要就是将响响应的数据类型修改成 arraybuffer

最后使用uni.arrayBufferToBase64()方法将 ArrayBuffer 对象转成 Base64 字符串

小程序将base64图片字符串保存到手机相册

  1. 去除 Base64 头部信息
    提取纯数据部分,确保正确解码。
  2. 转换为 ArrayBuffer
    使用 UniApp 提供的 base64ToArrayBuffer 方法转换数据。
  3. 写入临时文件
    将数据写入小程序的临时目录,生成临时文件路径。
  4. 保存到相册
    调用 uni.saveImageToPhotosAlbum 并处理权限和结果。

testSaveBase64ToPhotoAlbum.vue代码

复制代码
<template>
    <view>
        <button class="btn" @click="handleSaveImage()">保存到相册</button>
    </view>
</template>
<script>
export default {
    data(){
        return {
            base64Img:""

        }
    },

    onLoad(options){
        // this.base64Img = this.getBase64Image();
    },

    methods: {
        saveBase64ToPhotoAlbum(base64Data) {
			// 1. 去除Base64头部信息(如:"data:image/png;base64,")
			const base64 = base64Data.replace(/^data:image\/\w+;base64,/, '');
			
			// 2. 转换为ArrayBuffer
			const arrayBuffer = uni.base64ToArrayBuffer(base64);
			
			// 3. 生成临时文件路径
			const filePath = `${wx.env.USER_DATA_PATH}/temp_${Date.now()}.png`;
			
			// 4. 写入文件
			const fs = uni.getFileSystemManager();
			return new Promise((resolve, reject) => {
				fs.writeFile({
				filePath,
				data: arrayBuffer,
				encoding: 'binary',
				success: () => {
					// 5. 保存到相册
					uni.saveImageToPhotosAlbum({
					filePath,
					success: () => resolve('保存成功'),
					fail: (err) => reject('保存失败,请检查权限:' + err.errMsg),
					});
				},
				fail: (err) => reject('文件写入失败:' + err.errMsg),
				});
			});
		},

		// 调用示例
		async handleSaveImage() {
			try {
				// 示例Base64数据,实际替换为你的数据
				const base64 = this.getBase64Image();
				await this.saveBase64ToPhotoAlbum(base64);
				uni.showToast({ title: '保存成功', icon: 'success' });
				console.error("保存图片成功");
			} catch (error) {
				console.error("保存图片失败 error:", error);
				uni.showToast({ title: error, icon: 'none' });
				// 处理权限被拒绝的情况
				if (error.includes('authorize')) {
				uni.openSetting({}); // 引导用户打开权限设置
				}
			}
		},

		getBase64Image(){
			return "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoK";// 替换完整的Base64图片字符串
		}
    }
}
</script>

<style scoped>
    .btn {
        width: 100px;
        background-color: blue;
        border-radius: 16px;
		color: white;
        font-size: medium;
        font-weight: bold;
        text-align: center;
		padding: 0 0 0 0;
        margin: 26px;
    }
</style>
  1. 用户触发
    保存操作必须由用户主动触发(如点击按钮),否则 iOS 可能拦截。
  2. 权限处理
    首次调用会弹窗请求权限。
    若用户拒绝,捕获错误并引导前往设置开启:
    uni.openSetting({});
  3. 文件格式
    根据 Base64 的 MIME 类型(如 image/png)动态设置文件后缀,确保系统正确识别。
  4. 临时路径
    使用 wx.env.USER_DATA_PATH 获取小程序文件系统根目录,避免路径问题。
  5. 性能优化
    大图片转换可能耗时,建议添加加载提示:
相关推荐
朝新_8 分钟前
【Spring AI 】图像与语音模型实战
java·人工智能·spring
小码哥_常20 分钟前
Kotlin类型魔法:Any、Unit、Nothing 深度探秘
前端
RH23121141 分钟前
2026.4.16Linux 管道
java·linux·服务器
zmsofts1 小时前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
Web极客码1 小时前
深入了解WordPress网站访客意图
服务器·前端·wordpress
幺风2 小时前
Claude Code 源码分析 — Tool/MCP/Skill 可扩展工具系统
前端·javascript·ai编程
vjmap2 小时前
唯杰地图CAD图层加高性能特效扩展包发布
前端·gis
ZC跨境爬虫2 小时前
3D 地球卫星轨道可视化平台开发 Day7(AI异步加速+卫星系列精简+AI Agent自动评论)
前端·人工智能·3d·html·json
ID_180079054732 小时前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json
M ? A2 小时前
Vue 动态组件在 React 中,VuReact 会如何实现?
前端·javascript·vue.js·经验分享·react.js·面试·vureact