微信小程序?qū)崿F(xiàn)云開發(fā)上傳文件、圖片功能
一、前言
今天的博客所實(shí)現(xiàn)的功能很簡單,但是也很常用。
本文將這常用的代碼進(jìn)行了封裝,可以放入自己utils類中使用,加快開發(fā)速度。
實(shí)現(xiàn)的功能有兩個(gè):
一、選擇微信聊天文件并上傳。
二、選擇本地相冊/拍攝圖片上傳。
當(dāng)然,看標(biāo)題就知道是基于云開發(fā)的環(huán)境之下實(shí)現(xiàn)的了。
話不多說,進(jìn)入正文。
二、功能簡介
1、選擇微信聊天記錄中的文件
有時(shí)候小程序的使用場景是需要用戶上傳手機(jī)的文件,特別是excel、word、PDF等類型的文件。如果選擇讓用戶從本地文件夾里面去找,顯然有點(diǎn)困難。當(dāng)然,不僅僅只能選擇文件,還可以選擇視頻、圖片類型。具體的可以看官方的開發(fā)文檔。
因此小程序提供了一個(gè)API(wx.chooseMessageFile()),可以讓用戶從聊天記錄中選擇文件并上傳。
這樣選擇文件就方便很多了,例如:可以在文件傳輸助手中選擇。
2、選擇本地相冊/拍照圖片
選擇相冊圖片/拍攝圖片上傳這個(gè)功能就更加常用了。小程序提供實(shí)現(xiàn)的API是 wx.chooseImage()。
至于使用場景就不用多說了,很多場景都需要實(shí)現(xiàn)這一功能。這里就不做過多介紹,直接塞文檔了。具體的介紹,同學(xué)們可以前往官方文檔查看。
3、上傳功能
前面說了,本文將這幾個(gè)實(shí)現(xiàn)函數(shù)都進(jìn)行了封裝,因此選擇文件、選擇圖片、上傳三個(gè)功能是拆分出來的,降低了代碼的耦合性和復(fù)用性。
在云開發(fā)中,文件上傳的API與傳統(tǒng)服務(wù)器開發(fā)中的文件上傳API很像。
云開發(fā):wx.cloud.uploadFile() API介紹文檔
服務(wù)器:wx.uploadFile()API介紹文檔
三、實(shí)現(xiàn)代碼
1、選擇聊天文件函數(shù)(js)
/** * 從聊天記錄選擇文件 * @param {number} count 可選擇數(shù)量(1-100) * @param {string} type 可選擇文件類型 all:全部類型 video: 僅視頻 image: 僅圖片 file: 除了視頻、圖片外的文件類型 */ chooseMessageFile(count, type) { return new Promise((resolve, reject) => { wx.chooseMessageFile({ count: count, type: type, success(res) { resolve(res) }, fail(err) { console.log("選擇文件錯(cuò)誤 =====>", err) resolve(false) } }) }) },
2、選擇相冊函數(shù)(js)
/** 選擇圖片封裝函數(shù) * @param count 照片數(shù)量 * @param sizeType 照片的質(zhì)量, 默認(rèn) ['original', 'compressed'] * @param sourceType 照片來源, 默認(rèn) ['album', 'camera'] */ chooseImg(count, sizeType, sourceType) { if (!count) count = 1 if (!sizeType) sizeType = ['original', 'compressed'] if (!sourceType) sourceType = ['album', 'camera'] return new Promise((resolve, reject) => { wx.chooseImage({ count: count, sizeType: sizeType, sourceType: sourceType, success(res) { resolve(res) }, fail(err) { resolve(false) console.error("===== 選取照片失敗 =====", err) } }) }) },
3、上傳文件函數(shù)(js)
/** * 上傳文件封裝函數(shù), 文件名隨機(jī)性處理,由17位隨機(jī)字符+13位時(shí)間戳組成 * @param {string} filePath 要上傳圖片的臨時(shí)路徑 * @param {string} cloudPathPrefix 云數(shù)據(jù)庫存儲位置的文件路徑前綴 */ upLoadFile(filePath, cloudPathPrefix) { // 取隨機(jī)名 let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; let randomStr = ''; for (let i = 17; i > 0; --i) { randomStr += str[Math.floor(Math.random() * str.length)]; } randomStr += new Date().getTime() return new Promise((resolve, reject) => { let suffix = /\.\w+$/.exec(filePath)[0] //正則表達(dá)式返回文件的擴(kuò)展名 let cloudPath = cloudPathPrefix + '/' + randomStr + suffix wx.cloud.uploadFile({ cloudPath: cloudPath, filePath: filePath, success(res) { resolve(res) }, fail(err) { resolve(false) console.error("===== 上傳文件失敗 =====", err) }, }) }) },
4、調(diào)用示例
4-1、云存儲新建文件夾
4-2、完整調(diào)用代碼
WXML代碼
<button type="primary" style="margin-top: 105rpx;" bindtap="uploadFileTap" data-type="file">上傳文件</button> <button type="primary" style="margin-top: 45rpx;" bindtap="uploadFileTap" data-type="img">上傳圖片</button>
JS代碼
// pages/uploadFile/uploadFile.js Page({ /** * 頁面的初始數(shù)據(jù) */ data: {}, /** 上傳按鈕點(diǎn)擊監(jiān)聽 */ async uploadFileTap(res) { // 上傳類型 const type = res.currentTarget.dataset.type let filePathObj = null let filePathList = [] if (type == 'file') { filePathObj = await this.chooseMessageFile(1, 'file') if (!filePathObj) return filePathList.push(filePathObj.tempFiles[0].path) } else if (type == 'img') { filePathObj = await this.chooseImg(2) if (!filePathObj) return filePathList = filePathObj.tempFilePaths } else { return } console.log("選擇文件信息 ====>", filePathObj) let cloudPathList = [] for (let i = 0; i < filePathList.length; i++) { const cloudPathObj = await this.upLoadFile(filePathList[i], 'file') if (!cloudPathObj) { continue } console.log(filePathList[i], "文件上傳成功=====>", cloudPathObj) cloudPathList.push(cloudPathObj.fileID) } console.log("最終返回云文件ID列表 =====>", cloudPathList) }, /** * 從聊天記錄選擇文件 * @param {number} count 可選擇數(shù)量(1-100) * @param {string} type 可選擇文件類型 all:全部類型 video: 僅視頻 image: 僅圖片 file: 除了視頻、圖片外的文件類型 */ chooseMessageFile(count, type) { return new Promise((resolve, reject) => { wx.chooseMessageFile({ count: count, type: type, success(res) { resolve(res) }, fail(err) { console.log("選擇文件錯(cuò)誤 =====>", err) resolve(false) } }) }) }, /** 選擇圖片封裝函數(shù) * @param count 照片數(shù)量 * @param sizeType 照片的質(zhì)量, 默認(rèn) ['original', 'compressed'] * @param sourceType 照片來源, 默認(rèn) ['album', 'camera'] */ chooseImg(count, sizeType, sourceType) { if (!count) count = 1 if (!sizeType) sizeType = ['original', 'compressed'] if (!sourceType) sourceType = ['album', 'camera'] return new Promise((resolve, reject) => { wx.chooseImage({ count: count, sizeType: sizeType, sourceType: sourceType, success(res) { resolve(res) }, fail(err) { resolve(false) console.error("===== 選取照片失敗 =====", err) } }) }) }, /** * 上傳文件封裝函數(shù), 文件名隨機(jī)性處理,由17位隨機(jī)字符+13位時(shí)間戳組成 * @param {string} filePath 要上傳圖片的臨時(shí)路徑 * @param {string} cloudPathPrefix 云數(shù)據(jù)庫存儲文件路徑前綴 */ upLoadFile(filePath, cloudPathPrefix) { // 取隨機(jī)名 let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; let randomStr = ''; for (let i = 17; i > 0; --i) { randomStr += str[Math.floor(Math.random() * str.length)]; } randomStr += new Date().getTime() return new Promise((resolve, reject) => { let suffix = /\.\w+$/.exec(filePath)[0] //正則表達(dá)式返回文件的擴(kuò)展名 let cloudPath = cloudPathPrefix + '/' + randomStr + suffix wx.cloud.uploadFile({ cloudPath: cloudPath, filePath: filePath, success(res) { resolve(res) }, fail(err) { resolve(false) console.error("===== 上傳文件失敗 =====", err) }, }) }) }, })
4-3、實(shí)現(xiàn)效果
上傳成功
將文件或圖片上傳成功后,會(huì)返回存儲文件的fileID鏈接。將這個(gè)鏈接以及相關(guān)的信息存入數(shù)據(jù)庫即可,當(dāng)需要讀取的時(shí)候,從數(shù)據(jù)庫讀取,并將鏈接賦值給Image即可將圖片顯示出來。
四、結(jié)語
實(shí)際開發(fā)中的其他邏輯就不寫了。需要同學(xué)們自己去考慮異常情況處理等問題啦。
到此這篇關(guān)于微信小程序?qū)崿F(xiàn)云開發(fā)上傳文件、圖片功能的文章就介紹到這了,更多相關(guān)微信小程序云開發(fā)上傳文件圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信小程序?qū)崿F(xiàn)上傳照片代碼實(shí)例解析
- uni-app開發(fā)微信小程序之H5壓縮上傳圖片的問題詳解
- 微信小程序?qū)崿F(xiàn)多文件或者圖片上傳
- 微信小程序?qū)崿F(xiàn)上傳圖片
- 微信小程序圖片上傳組件實(shí)現(xiàn)圖片拖拽排序
- 微信小程序?qū)崿F(xiàn)上傳圖片的功能
- 微信小程序?qū)崿F(xiàn)上傳多張圖片、刪除圖片
- 微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片
- 微信小程序?qū)崿F(xiàn)一張或多張圖片上傳(云開發(fā))
- 微信小程序?qū)崿F(xiàn)文件、圖片上傳功能
- 微信小程序?qū)崿F(xiàn)多張照片上傳功能
相關(guān)文章
js實(shí)現(xiàn)頂部可折疊的菜單工具欄效果實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)頂部可折疊的菜單工具欄效果,可實(shí)現(xiàn)鼠標(biāo)滑過菜單工具欄出現(xiàn)折疊與展開效果,涉及javascript鼠標(biāo)事件及樣式的操作技巧,需要的朋友可以參考下2015-05-05微信小程序動(dòng)態(tài)生成二維碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序動(dòng)態(tài)生成二維碼的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-07-07JavaScript時(shí)間復(fù)雜度和空間復(fù)雜度
這篇文章主要介紹了JavaScript時(shí)間復(fù)雜度和空間復(fù)雜度,時(shí)間復(fù)雜度和空間復(fù)雜度是衡量一個(gè)算法是否優(yōu)秀的標(biāo)準(zhǔn),通常我們比較兩個(gè)算法時(shí)會(huì)用預(yù)先估算和事后統(tǒng)計(jì),下文詳細(xì)介紹,需要的朋友可以參考一下2022-07-07JS使用Promise時(shí)常見的5個(gè)錯(cuò)誤總結(jié)
Promise?提供了一種優(yōu)雅的方法來處理?JS?中的異步操作。這也是避免“回調(diào)地獄”的解決方案。然而,并沒有多少開發(fā)人員了解其中的內(nèi)容。因此,許多人在實(shí)踐中往往會(huì)犯錯(cuò)誤。在本文中,介紹一下使用?promise?時(shí)的五個(gè)常見錯(cuò)誤,希望大家能夠避免2022-11-11jQuery Mobile動(dòng)態(tài)刷新頁面樣式的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨Query Mobile動(dòng)態(tài)刷新頁面樣式的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05小程序animate動(dòng)畫實(shí)現(xiàn)直播間點(diǎn)贊
這篇文章主要為大家詳細(xì)介紹了小程序animate動(dòng)畫實(shí)現(xiàn)直播間點(diǎn)贊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07