更新记录
1.0.0(2023-06-29)
新版首发
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:支持,arm64-v8a:支持,x86:支持 | 适用版本区间:11 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
KJ-Base64ToFile
超大base64转文件,测过1G文件
使用KJ-FileSlice插件,可以实现超大文件转base64,本插件不包含:https://ext.dcloud.net.cn/plugin?id=3319
实现超大base64转文件
//例子:
var dic = {
"saveFilePath": plus.io.convertLocalFileSystemURL("_doc/KJ-Base64ToFile"), //保存文件的绝对路径
"saveFileName": "1G.zip" //保存的文件名称,后缀名要跟base64数据格式一致
}
KJBase64ToFile.initData(dic, (res) => {}); //初始化数据
var base64 = "xxxx"; //1G的base64
var arr = this.splitStr(base64); //字符串切片
for (var i = 0; i < arr.length; i++) {
var base64Slice = arr[i];
var dic2 = {
"base64": base64Slice, //传入的base64长度不能
"sliceSize": 50 * 1024, //再次分段读取base64的长度,最好不要修改,值过大,会影响性能或闪退
}
KJBase64ToFile.addBase64Slice(dic2,(res)=>{ //添加base64切片
if(i == arr.length-1) {
KJBase64ToFile.finishData((res) => { //完成添加base64数据 会回调文件绝对路径
});
}
});
}
使用
<template>
<view class="content">
<view>----使用KJ-FileSlice插件,实现超大文件转base64----</view>
<button type="primary" @click="fileToBase64">超大文件转base64</button>
<view>----超大base64转文件,本插件的方法----</view>
<button type="primary" @click="initData">初始化数据</button>
<button type="primary" @click="addBase64Slice">添加base64切片</button>
<button type="primary" @click="finishData">完成添加base64数据</button>
</view>
</template>
<script>
//例子:
// var dic = {
// "saveFilePath": plus.io.convertLocalFileSystemURL("_doc/KJ-Base64ToFile"), //保存文件的绝对路径
// "saveFileName": "1G.zip" //保存的文件名称,后缀名要跟base64数据格式一致
// }
// KJBase64ToFile.initData(dic, (res) => {}); //初始化数据
// var base64 = "xxxx"; //1G的base64
// var arr = this.splitStr(base64); //字符串切片
// for (var i = 0; i < arr.length; i++) {
// var base64Slice = arr[i];
// var dic2 = {
// "base64": base64Slice, //传入的base64长度不能
// "sliceSize": 50 * 1024, //再次分段读取base64的长度,最好不要修改,值过大,会影响性能或闪退
// }
// KJBase64ToFile.addBase64Slice(dic2,(res)=>{ //添加base64切片
// if(i == arr.length-1) {
// KJBase64ToFile.finishData((res) => { //完成添加base64数据 会回调文件绝对路径
// });
// }
// });
// }
var KJBase64ToFile = uni.requireNativePlugin("KJ-Base64ToFile");
export default {
data() {
return {}
},
onLoad() {},
methods: {
fileToBase64() {
this.initData();
const KJFileSlice = uni.requireNativePlugin(
'KJ-FileSlice'); //该插件是大文件切片,本插件不包含:https://ext.dcloud.net.cn/plugin?id=3319
var dic = {
"pathFileName": plus.io.convertLocalFileSystemURL("static/1G.zip"),
"savePath": plus.io.convertLocalFileSystemURL("_doc/KJ-FileSlice"), //保存切片地址,一定要是_doc目录
"sliceSize": 10 * 1024 * 1024, //切片大小,单位(B)
"sliceSuffixName": "" //保存切片的后缀名
}
KJFileSlice.start(dic, (res) => {
console.log("start全部切片完成: " + JSON.stringify(res));
if (res.error.length > 0) {
console.log("切片错误:" + res.error);
}
this.test(res.slices)
}, (res) => {
//console.log("start单个切片: " + JSON.stringify(res));
if (res.error.length > 0) {
console.log("切片错误:" + res.error);
}
if (res.isFinish) {
console.log("切片结束");
}
});
},
async test(slices) {
console.log("总:" + (slices.length - 1));
for (var i = 0; i < slices.length; i++) {
var dic = slices[i];
await new Promise((resolve, reject) => { // 添加切片base64的顺序不要变
this.sliceFileToBase64(dic.filePath, (res) => {
resolve("task" + i);
console.log(" 已完成:" + i);
if (i == slices.length - 1) {
this.finishData();
}
});
});
}
},
sliceFileToBase64(path, callback) {
//官方plus.io andorid文件转base64,有点慢,请耐心等待,不支持一次性读取大文件
plus.io.resolveLocalFileSystemURL(path, (entry) => {
entry.file((file) => {
var reader = new plus.io.FileReader();
reader.onloadend = (e) => {
var base64 = e.target.result;
base64 = base64.split(";")[1];
var reg1 = new RegExp("base64,", "g");
base64 = base64.replace(reg1, ""); //去掉base64的前缀
this.addBase64Slice(base64, (res) => {
callback(res);
});
};
reader.readAsDataURL(file);
}, (e) => {
console.log("error:" + e);
})
})
},
initData() {
var dic = {
"saveFilePath": plus.io.convertLocalFileSystemURL("_doc/KJ-Base64ToFile"), //保存文件的绝对路径
"saveFileName": "1G.zip" //保存的文件名称,后缀名要跟base64数据格式一致
}
KJBase64ToFile.initData(dic, (res) => {
console.log("initData:" + JSON.stringify(res));
});
},
addBase64Slice(base64Slice, callback) {
var dic = {
"base64": base64Slice, //传入的base64长度不能
"sliceSize": 50 * 1024, //再次分段读取base64的长度,最好不要修改,值过大,会影响性能或闪退
}
KJBase64ToFile.addBase64Slice(dic, (res) => { //单次不能添加过大的字符串,会奔溃,分开多次添加
console.log("addBase64Slice:" + JSON.stringify(res));
callback(res);
});
},
finishData() {
KJBase64ToFile.finishData((res) => {
console.log("finishData:" + JSON.stringify(res));
/**
* filePathName - 转化完成之后的 文件绝对路径
* */
})
},
splitStr(str) { //字符串切片
if (str.length < 10 * 1024 * 1024) {
var rs = [];
rs[0] = str;
return rs
} else {
let size = 10 * 1024 * 1024
let count = Math.ceil(str.length / size)
let rs = []
for (let i = 0; i <= count; i++) {
if (i === 0) {
rs.push(str.substring(i, size))
} else if (i > 0 && i < count) {
rs.push(str.substring((i * size) + 1, (i + 1) * size))
} else {
rs.push(str.substring((i * size) + 1, str.length - 1))
}
}
return rs;
}
}
}
}
</script>