uni.chooseMedia 读取base64 或 二进制

获取path

复制代码
uni.chooseMedia({
  count:1,
  success(res){
    let path = res.tempFiles[0].tempFilePath;
    // Android content:// 先转成本地可上传地址
    if(path.startsWith('content://')){
       path = plus.io.convertLocalFileSystemURL(path);
    }
    //获得path
  }
});

获取base64

复制代码
function convertLocalPathToBlob(path) {
	return new Promise((resolve, reject) => {
		uni.saveFile({
			tempFilePath: path, // 临时文件路
			success(res) {
				const savedFilePath = res.savedFilePath; // 保存后的文件路径
				plus.io.resolveLocalFileSystemURL(savedFilePath, (entry) => {
					console.log("准备读取文件");
					console.log("entry", entry);
					entry.file((file) => {
						console.log("进入entry", file);
						const absolutePath = entry.fullPath;
						const reader = new plus.io.FileReader();
						reader.onloadend = (e) => {
							//console.log("读取文件成功", e.target.result);
							resolve(e.target.result);
						};
						reader.onerror = (err) => {
							console.log("读取文件失败", err);
							reject(err);
						};
						reader.onprogress = function(event) {
							console.log("读取进度:", event.loaded, event.total);
						};
						reader.readAsDataURL(file); //只能读出来base64
						// reader.readAsArrayBuffer(absolutePath); //这里二进制死活读不出来
						console.log("reader", reader);
						console.log("进入entry结束", reader);
					});
				}, (err) => {
					console.log("准备读取文件失败", err);
					reject(err);
				});
			}
		})
	})
}

base64转二进制

复制代码
const arrayBuffer = uni.base64ToArrayBuffer(dataURL.split(',')[1]);

复制代码
// base64转二进制
function dataURLtoArrayBuffer(dataURL) {
  const base64 = dataURL.split(',')[1];
  const binaryString = atob(base64);
  const len = binaryString.length;
  const bytes = new Uint8Array(len);
  
  for (let i = 0; i < len; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  
  return bytes.buffer;
}

注意

复制代码
const xhr = new plus.net.XMLHttpRequest();
xhr.open('PUT', resa.uploadUrl, true);
xhr.mimeType = fileType || 'application/octet-stream';
xhr.responseType = 'arraybuffer';
// 监听数据接收进度
xhr.onprogress = function(event) {
 	console.log('event',event)
     if (event.lengthComputable) {
         const percent = (event.loaded / event.total) * 100;
         console.log('上传进度:', percent + '%');
     }
 };
 const binaryString = arrayBufferToString(arrayBuffer);
 xhr.setRequestHeader('Content-Type',  'image/jpeg' ); 
 xhr.send(binaryString);//plus.net.XMLHttpRequest 只能上传文本,不能上传二进制 这里卡了好久

function saveImage(ab, fileName) {
  return new Promise((resolve, reject) => {
    // 1. 先申请存储权限(Android 10+ 必须)
    plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'], () => {
      // 2. 创建写入目录
      const dir = '_doc/';   // 也可换 '_downloads/' 等
      plus.io.requestFileSystem(plus.io.PRIVATE_DOC, fs => {
        fs.root.getDirectory(dir, { create: true }, dirEntry => {
          // 3. 创建空文件
		  console.log(111);
          dirEntry.getFile(fileName, { create: true }, fileEntry => {
            // 4. 写入 ArrayBuffer
            fileEntry.createWriter(writer => {
				console.log(222);
              writer.onwrite = () => resolve(fileEntry.fullPath); // 写盘完成
              writer.onerror = e => {console.error('Writer 错误:', e);reject(e);}
              console.log(333);
			  //const blob = new Blob([ab], { type: 'image/jpeg' });
			  writer.write(blob);//uniapp 这里保存二进制,每次保存都是文件可以创建,但是大小只有0B,查询说也是只可以保存文本,不能保存二进制
			  console.log(444);// 直接写 ArrayBuffer
            }, reject);
          }, reject);
        }, reject);
      }, reject);
    }, reject);
  });
}

本来想用 plus.net.XMLHttpRequest() 直接上传二进制文件,但是不能发送二进制,后来有试了renderjs 中的XMLHttpRequest ,测试可以上传,请看我其他文章

相关推荐
To_OC7 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
不好听6137 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus7 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
前端小李子8 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech8 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn8 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言