uniapp小程序上傳圖片功能的實(shí)現(xiàn)
??前言
本篇文章我們研究一下,在移動(dòng)端開發(fā)過(guò)程中經(jīng)常使用到的圖片上傳功能。在大多數(shù)小程序或者APP中都會(huì)遇到一些實(shí)名認(rèn)證或者頭像上傳的功能。uniapp官方也提供了相應(yīng)的API供我們使用。
官網(wǎng)地址:uni.chooseImage(OBJECT)
??正文
1、首先看官網(wǎng)
uni.chooseImage(OBJECT) API 介紹
從本地相冊(cè)選擇圖片或使用相機(jī)拍照。
App端如需要更豐富的相機(jī)拍照API(如直接調(diào)用前置攝像頭),參考plus.camera
微信小程序從基礎(chǔ)庫(kù) 2.21.0 開始, wx.chooseImage 停止維護(hù),請(qǐng)使用 uni.chooseMedia 代替。
OBJECT 參數(shù)說(shuō)明
參數(shù)名 | 類型 | 必填 | 說(shuō)明 | 平臺(tái)差異說(shuō)明 |
---|---|---|---|---|
count | Number | 否 | 最多可以選擇的圖片張數(shù),默認(rèn)9 | 見下方說(shuō)明 |
sizeType | Array | 否 | original 原圖,compressed 壓縮圖,默認(rèn)二者都有 | App、微信小程序、支付寶小程序、百度小程序 |
extension | Array | 否 | 根據(jù)文件拓展名過(guò)濾,每一項(xiàng)都不能是空字符串。默認(rèn)不過(guò)濾。 | H5(HBuilder X2.9.9+) |
sourceType | Array | 否 | album 從相冊(cè)選圖,camera 使用相機(jī),默認(rèn)二者都有。如需直接開相機(jī)或直接選相冊(cè),請(qǐng)只使用一個(gè)選項(xiàng) | |
crop | Object | 否 | 圖像裁剪參數(shù),設(shè)置后 sizeType 失效 | App 3.1.19+ |
success | Function | 是 | 成功則返回圖片的本地文件路徑列表 tempFilePaths | |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù) | 小程序、App |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
crop 參數(shù)說(shuō)明
參數(shù)名 | 類型 | 必填 | 說(shuō)明 | 平臺(tái)差異說(shuō)明 |
---|---|---|---|---|
quality | Number | 否 | 取值范圍為1-100,數(shù)值越小,質(zhì)量越低(僅對(duì)jpg格式有效)。默認(rèn)值為80。 | |
width | Number | 是 | 裁剪的寬度,單位為px,用于計(jì)算裁剪寬高比。 | |
height | Number | 是 | 裁剪的高度,單位為px,用于計(jì)算裁剪寬高比。 | |
resize | Boolean | 否 | 是否將width和height作為裁剪保存圖片真實(shí)的像素值。默認(rèn)值為true。注:設(shè)置為false時(shí)在裁剪編輯界面顯示圖片的像素值,設(shè)置為true時(shí)不顯示 |
Tips
- count 值在 H5 平臺(tái)的表現(xiàn),基于瀏覽器本身的規(guī)范。目前測(cè)試的結(jié)果來(lái)看,只能限制單選/多選,并不能限制數(shù)量。并且,在實(shí)際的手機(jī)瀏覽器很少有能夠支持多選的。
- sourceType 值在 H5 平臺(tái)根據(jù)瀏覽器的不同而表現(xiàn)不同,一般不可限制僅使用相冊(cè),部分瀏覽器也無(wú)法限制是否使用相機(jī)。
- 可以通過(guò)用戶授權(quán)API來(lái)判斷用戶是否給應(yīng)用授予相冊(cè)或攝像頭的訪問(wèn)權(quán)限https://uniapp.dcloud.io/api/other/authorize`
- App端如需選擇非媒體文件,可在插件市場(chǎng)搜索文件選擇,其中Android端可以使用Native.js,無(wú)需原生插件,而iOS端需要原生插件。
- 選擇照片大多為了上傳,uni ui封裝了更完善的uni-file-picker組件,文件選擇、上傳到uniCloud的免費(fèi)存儲(chǔ)和cdn中,一站式集成。強(qiáng)烈推薦使用。
注:文件的臨時(shí)路徑,在應(yīng)用本次啟動(dòng)期間可以正常使用,如需持久保存,需在主動(dòng)調(diào)用 uni.saveFile,在應(yīng)用下次啟動(dòng)時(shí)才能訪問(wèn)得到。
success 返回參數(shù)說(shuō)明
數(shù) | 類型 | 說(shuō)明 |
---|---|---|
tempFilePaths | Array | 圖片的本地文件路徑列表 |
tempFiles | Array、Array | 圖片的本地文件列表,每一項(xiàng)是一個(gè) File 對(duì)象 |
File 對(duì)象結(jié)構(gòu)如下
參數(shù) | 類型 | 說(shuō)明 |
---|---|---|
path | String | 本地文件路徑 |
size | Number | 本地文件大小,單位:B |
name | String | 包含擴(kuò)展名的文件名稱,僅H5支持 |
type | String | 文件類型,僅H5支持 |
示例
uni.chooseImage({ count: 6, //默認(rèn)9 sizeType: ['original', 'compressed'], //可以指定是原圖還是壓縮圖,默認(rèn)二者都有 sourceType: ['album'], //從相冊(cè)選擇 success: function (res) { console.log(JSON.stringify(res.tempFilePaths)); } });
這里給大家說(shuō)個(gè)大坑
:
chooseImage這個(gè)方法的成功回調(diào)函數(shù),success 必須使用ES6 的箭頭函數(shù),否則this的作用域是當(dāng)前函數(shù),就獲取不到data方法中的自己定義的變量。如果不理解的話,請(qǐng)看下面案例展示內(nèi)容。ES6 箭頭函數(shù)官方描述:對(duì)于普通函數(shù)來(lái)說(shuō),內(nèi)部的this指向函數(shù)運(yùn)行時(shí)所在的對(duì)象,但是這一點(diǎn)對(duì)箭頭函數(shù)不成立。它沒(méi)有自己的this對(duì)象,內(nèi)部的this就是定義時(shí)上層作用域中的this。也就是說(shuō),箭頭函數(shù)內(nèi)部的this指向是固定的,相比之下,普通函數(shù)的this指向是可變的。
2、案例代碼演示
看了官網(wǎng)的案例 我們也來(lái)自己動(dòng)手寫一寫。
本案例操作描述:默認(rèn)顯示添加封面按鈕,點(diǎn)擊調(diào)用本地圖片選擇上傳一張作為封面使用,可進(jìn)行切換。(忽略項(xiàng)目中比較丑陋的字體顏色,只做案例展示使用,與本人審美無(wú)關(guān)(狗頭))參數(shù)設(shè)置我在代碼中都做了詳細(xì)的解釋,沒(méi)有寫的參數(shù)使用官網(wǎng)的默認(rèn)值。成功的回調(diào)函數(shù)success寫了一種 ES5 的形式,寫了一種 ES6 的形式供大家參考。封面圖片的src是用了動(dòng)態(tài)賦值的方式(:src="cover")。
<template> <view> <view class="add-cover" @click="upload"> <!-- 這里使用 :src="cover" 將src動(dòng)態(tài)賦值--> <image class="cover" :src="cover" mode="aspectFill"></image> <view class="default"> <image src="../../../static/add.png" class="add-icon"></image> <!-- 沒(méi)有上傳圖片時(shí)狀態(tài)是添加,上傳版完畢是切換 --> <text>點(diǎn)擊{{cover?'切換':'添加'}}封面</text> </view> </view> </view> </template> <script> export default { data() { return { cover: '' }; }, methods: { // 方式一:使用箭頭函數(shù) upload() { uni.chooseImage({ count: 1, //默認(rèn)9,這里設(shè)置只允許選擇一張圖片 sizeType: ['original', 'compressed'], //可以指定是原圖還是壓縮圖,默認(rèn)二者都有 sourceType: ['album'], //這里選擇從相冊(cè)選擇,也可刪除此項(xiàng)設(shè)置默認(rèn)拍照和相冊(cè)兩種選擇 success: res => { // 實(shí)際開發(fā)中,成功的回調(diào)函數(shù)中是一個(gè)上傳圖片到服務(wù)器的接口,這里只是做了簡(jiǎn)單的效果,實(shí)際根據(jù)接口需要的參數(shù)格式進(jìn)行上傳 // console.log(JSON.stringify(res.tempFilePaths)); 打印的結(jié)果是以數(shù)組方式返回的,所以我們只需要取第一個(gè)值:["blob:http://localhost:8080/c18cded6-ab83-4d0e-9ccd-ce2e402b7d3f"] this.cover = res.tempFilePaths[0] // 將選擇的圖片賦值給我們定義的cover } }); } // 方式二:不使用箭頭函數(shù)(不使用箭頭函數(shù)就需要定義變量去賦值this,如下_this) // upload() { // var _this = this // uni.chooseImage({ // count: 1, //默認(rèn)9,這里設(shè)置只允許選擇一張圖片 // sizeType: ['original', 'compressed'], //可以指定是原圖還是壓縮圖,默認(rèn)二者都有 // sourceType: ['album'], //這里選擇從相冊(cè)選擇,也可刪除此項(xiàng)設(shè)置默認(rèn)拍照和相冊(cè)兩種選擇 // success: function(res) { // _this.cover = res.tempFilePaths[0] // } // }); // } } } </script> <style lang="scss"> .cover { width: 100%; height: 350rpx; } .default { background-color: #f8f9fc; width: 100%; height: 350rpx; display: flex; flex-direction: column; justify-content: center; align-items: center; color: red; font-weight: 800; position: absolute; top: 0; background-color: rgba(255, 255, 255, 0.2); } .add-icon { width: 50rpx; height: 50rpx; margin-bottom: 20rpx; } </style>
在此說(shuō)明:
本案例只做了本地上傳圖片的效果,沒(méi)有調(diào)用接口上傳到服務(wù)器,實(shí)際工作開發(fā)中是會(huì)有圖片上傳接口的,官網(wǎng)也提供了對(duì)應(yīng)的將本地資源上傳到開發(fā)者服務(wù)器API:uni.uploadFile(OBJECT),大家可以去參考一下。如有實(shí)際開發(fā)接口問(wèn)題可私信博主。
3、效果展示
到此這篇關(guān)于uniapp小程序上傳圖片的文章就介紹到這了,更多相關(guān)uniapp小程序 上傳圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3中el-uplod結(jié)合ts實(shí)現(xiàn)圖片粘貼上傳
- Vue3+Koa2實(shí)現(xiàn)圖片上傳功能的示例代碼
- Vue3?+?elementplus實(shí)現(xiàn)表單驗(yàn)證+上傳圖片+?防止表單重復(fù)提交功能
- Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片的方法實(shí)現(xiàn)
- vue3.0?移動(dòng)端二次封裝van-uploader實(shí)現(xiàn)上傳圖片(vant組件庫(kù))
- 利用Vue3和element-plus實(shí)現(xiàn)圖片上傳組件
- uniapp上傳本地圖片以及以二進(jìn)制流的方式上傳
- uniapp上傳圖片和上傳視頻的實(shí)現(xiàn)方法
- uniapp+vue3實(shí)現(xiàn)上傳圖片組件封裝功能
相關(guān)文章
JS/jQuery實(shí)現(xiàn)超簡(jiǎn)單的Table表格添加,刪除行功能示例
這篇文章主要介紹了JS/jQuery實(shí)現(xiàn)超簡(jiǎn)單的Table表格添加,刪除行功能,結(jié)合實(shí)例形式詳細(xì)分析了JS與jQuery針對(duì)Table表格添加,刪除行功能的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07ajaxControlToolkit AutoCompleteExtender的用法
昨天在搜索中使用了這個(gè)控件,不過(guò)不知道為什么在IE中反應(yīng)比較慢2008-10-10HTML頁(yè)面,測(cè)試JS對(duì)C函數(shù)的調(diào)用簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇HTML頁(yè)面,測(cè)試JS對(duì)C函數(shù)的調(diào)用簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08js實(shí)現(xiàn)九宮格的隨機(jī)顏色跳轉(zhuǎn)
本篇文章主要介紹了js實(shí)現(xiàn)九宮格的隨機(jī)顏色跳轉(zhuǎn)的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02Iphone手機(jī)、安卓手機(jī)瀏覽器控制默認(rèn)縮放大小的方法總結(jié)(附代碼)
這篇文章主要介紹了Iphone手機(jī)、安卓手機(jī)瀏覽器控制默認(rèn)縮放大小的方法,通過(guò)meta標(biāo)簽中添加屬性代碼展示控制瀏覽器的默認(rèn)縮放,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08