在用 uniapp 开发 app 会遇到 App 端不支持Blob 没有 Blob 这个类
网上搜了一下教程解决办法如下
思路就是用script标签 renderjs的原生代码去拿到这个 Blob 这个类,此时如果你的代码已经写了很多逻辑不用怕,咱们可以使用 renderjs在renderjs和service之间 具体要了解 renderjs 是什么的可以先看这篇文章juejin.cn/post/704918…
HTML 代码
<u--form
ref="picInfoRef"
:rules="picRules"
:model="pictureInfo"
labelPosition="top"
labelWidth="200"
>
<text :prop="options" :change:prop="upload.onChange"></text>
<u-form-item prop="id_picture_front" borderBottom>
<div class="id-card">
<image
:src="
pictureInfo.picture1
? pictureInfo.picture1
: '../../static/image/identity/front.png'
"
mode="widthFix"
@click="uploadImage1"
></image>
<div>{{ $t('id_picture_front') }}</div>
</div>
</u-form-item>
<u-form-item prop="id_picture_back" borderBottom>
<div class="id-card">
<image
:src="
pictureInfo.picture2
? pictureInfo.picture2
: '../../static/image/identity/back.png'
"
mode="widthFix"
@click="uploadImage2"
></image>
<div>{{ $t('id_picture_back') }}</div>
</div>
</u-form-item>
<u-form-item prop="ocr_img" borderBottom>
<div class="id-card">
<image
:src="
pictureInfo.picture3
? pictureInfo.picture3
: '../../static/image/identity/man.png'
"
mode="widthFix"
@click="uploadImage3"
></image>
<div>{{ $t('ocr_img') }}</div>
</div>
</u-form-item>
</u--form>
renderjs 层代码
<!-- 上传 转 blob -->
<!-- TODO 这里必须用 renderjs 来转 blob 不然Vue 文件里面没有 blob 这个类,module="upload"对应上面的标识名字随便取-->
<script module="upload" lang="renderjs">
import axios from 'axios';
export default {
data() {
return {};
},
methods: {
handleClick(event, ownerInstance) {
ownerInstance.callMethod('acceptDataFromRenderjs', {
content: '测试文字',
});
},
onChange(newValue, oldValue, ownerInstance, instance) {
console.log('新值', newValue);
if (!newValue) {
return;
}
let { speech, put_url, url, tempFiles } = newValue;
let file = tempFiles ? tempFiles : this.dataURLtoBlob(speech);
console.log(file,url);
axios
.put(put_url, file)
.catch((error) => {
uni.$u.toast(`${t('network_err')}`);
console.error(error);
});
},
dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime,
});
},
},
created() {
console.log('renderjs初始化完毕');
},
};
</script>
<script setup>
import { ref, reactive, computed, watch } from 'vue';
import { uploadImage } from '../../utils/common/upload';
const options = ref();
async function uploadImage1() {
let uploadRes = await uploadImage();
console.log(uploadRes);
options.value = uploadRes;
pictureInfo.picture1 = uploadRes.path;
pictureInfo.id_picture_front = uploadRes.url;
}
async function uploadImage2() {
let uploadRes = await uploadImage();
options.value = uploadRes;
pictureInfo.picture2 = uploadRes.path;
pictureInfo.id_picture_back = uploadRes.url;
}
async function uploadImage3() {
let uploadRes = await uploadImage();
options.value = uploadRes;
pictureInfo.picture3 = uploadRes.path;
pictureInfo.ocr_img = uploadRes.url;
}
<script>