元件(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 })