获取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 ,测试可以上传,请看我其他文章
