组件(2选1):
1. uni-file-picker : https://uniapp.dcloud.net.cn/component/uniui/uni-file-picker.html
2. u-upload : https://uviewui.com/components/upload.html
思路:
不想直接把图片存到数据库,因为想着图片是小文件,也不是重要文件,干脆存到数据库里就好了。
因此,计划在前端上传图片的时候,转成arraybuffer之类的,再存到数据库里,表设计的字段为byte[] , 在MSSQL中类型为Image
过程:
实际传参的时候,用的是JSON对象(要传很多参数,如果只有文件数据还好说,用FormData传过去),结果arraybuffer,Uint8Array都传不过去,也用了下FormData的方式,都不行,应该说是不懂怎么用。
后来想着传Base64过去,但需要用string类型字段先接收,在后端把string转成byte[] (C#里的Convert.FromBase64String()方法)
在 u-upload的@afterRead="afterRead"方法里用e.tempFilePaths[0]开始转换Base64 , 或者在 uni-file-picker 的@select="select"方法里用lists[i].url开始转换Base64.
select(e) { console.log('选择文件:', e) // e.tempFilePaths[0] } afterRead(event) { // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 let lists = [].concat(event.file) for (let i = 0; i < lists.length; i++) { // lists[i].url } }
一开始在电脑上用浏览器的方式测试,转换Base64,能够正常运行, 后来到APP上一试,发现不行了,点击拍照后确定,回到界面时没有把图片加载到控件里。
return new Promise((resolve, reject) => { uni.request({ url: url, method: 'GET', responseType: 'Arraybuffer', success: res => { console.log(res) let base64 = uni.arrayBufferToBase64((res.data)) resolve(base64) }, fail: (e) => { reject(e) } }) })
最后在网上找到了CompressImage方法,终于成功了。
return new Promise((resolve, reject) => { // #ifdef H5 uni.request({ url: url, method: 'GET', responseType: 'Arraybuffer', success: res => { console.log(res) let base64 = uni.arrayBufferToBase64((res.data)) resolve(base64) }, fail: (e) => { reject(e) } }) // #endif // #ifdef APP uni.compressImage({ src: url, quality: 100, success: (res) => { const tempUrl = res.tempFilePath plus.io.resolveLocalFileSystemURL(tempUrl, (entry) => { entry.file((e) => { let fileReader = new plus.io.FileReader(); fileReader.onload = (r) => { console.log(r.target.result) resolve(r.target.result) } fileReader.readAsDataURL(e) }) }) }, fail: (e) => { reject(e) } }) // #endif })
标签:Uniapp,resolve,url,res,APP,Base64,file,uni From: https://www.cnblogs.com/WikiChen/p/18529698