<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上節中我們講到小程式的request請求,掌握了基本的網路請求方式,這節我們通過小程式的uploadFile介面能力完成對小程式上傳操作(uni.uploadFile,後端php介面),通過這一節你可以學習到php的上傳介面的寫法,以及如何配合前端完成一個小程式上傳操作
我們預設使用建立新專案進行講解,在index.vue最上方寫入程式碼
<template> <view style="width: 750rpx;height: 200rpx;display: flex;flex-direction: column;"> 上傳的檔名: <button type="primary" style="width: 500rpx;" @click="upload()">點選上傳</button> </view> </template>
通過前端點選“點選上傳”來呼叫對應的方法
建立後執行如下
這裡插一嘴,由於博主是全棧開發的,我給大家總結一下這部分與微信開發者工具 語法的區別
①uniapp必須用template標籤巢狀
否則
②小程式點選事件用bindtap 而uniapp用@click
③uniapp的方法需要放在methods: {}裡面
接下來我們在剛剛建立測試的方法upload中進行修改,首先整個動作原理是:通過點選按鈕觸發upload方法=》選擇檔案獲取到原生的路徑=》上傳給伺服器=》伺服器返回上傳的檔名(上傳後隨機生成的)
瞭解到整個流程後我們先將 檔案進行選擇
uni.chooseImage範例
uni.chooseImage({ success: (chooseImageRes) => { const tempFilePaths = chooseImageRes.tempFilePaths; console.log(tempFilePaths); } });
將程式碼放在unload中執行測試
可以看到已經生成了臨時的檔案
接下來我們通過uni.uploadFile
方法完成對檔案的上傳
uni.uploadFile範例
uni.uploadFile({ url: 'https://www.example.com/upload', //僅為範例,非真實的介面地址 filePath: tempFilePaths[0], name: 'file', formData: { 'user': 'test' }, success: (uploadFileRes) => { console.log(uploadFileRes.data); } });
在寫事件前,我通過在伺服器上新建一個php檔案作為檔案上傳的介面
新建tp_imgsrc.php
考慮到大多數初學者這裡決定用原生php進行開發
<?php // 上傳圖片 function uploadimg() { $file = $_FILES['file']; if ($file) { //var_dump($file); // 獲取檔案字尾名 $ext = pathinfo($file['name'], PATHINFO_EXTENSION); $target = 'upload/' . uniqid() . '.' . $ext; // 轉移圖片地址 if (!move_uploaded_file($file['tmp_name'], $target)) { $GLOBALS['error_message'] = '上傳圖片失敗'; echo error_message; } die( json_encode( array( 'errCode' => 0, 'error_message'=>'圖片上傳成功', 'file'=>$target ),480) ); } } uploadimg();
完成後整個目錄是這樣的(層級關係)
接下來 我們將剛剛的上傳介面uni.uploadFile
與檔案選擇介面uni.chooseImage
合併一下完成整個流程,也就是選擇檔案完成後,將選擇的檔案上傳
我們在upload方法中寫入
let that=this; console.log("我被點選了"); uni.chooseImage({ success: (chooseImageRes) => { const tempFilePaths = chooseImageRes.tempFilePaths; console.log(tempFilePaths); uni.uploadFile({ url: 'https://你的介面地址/tp_imgsrc.php', //僅為範例,非真實的介面地址 filePath: tempFilePaths[0], name: 'file', formData: { }, success: (uploadFileRes) => { console.log(uploadFileRes.data); } }); } });
測試執行看看
返回了檔名和我自己定義的返回碼
可以看到伺服器上也是存在這個檔案的
最重要的步驟我們已經做完了,那上傳成功是不是得告訴下上傳的使用者告訴他們上傳成功了?
於是我們需要做一下判斷,當errCode==0的時候高速使用者上傳成功
但是發現了個問題,php返回的是陣列,為啥到uniapp返回的是字串?
指導我看了下官方的檔案
返回的是字元型別
解決辦法:
let param_json = JSON.stringify(this.$data)//轉為字串 let bookkeeping_data = JSON.parse(bookkeeping_data_string)//轉換為JSON
測試後完美解決
改動到的程式碼
let json_data = JSON.parse(uploadFileRes.data) console.log(json_data['errCode']);
接下來就可以將資訊告訴使用者是否上傳成功了
uni.showToast範例
uni.showToast({ title: '標題', icon:'none' duration: 2000 });
相應的程式碼:
let json_data = JSON.parse(uploadFileRes.data) console.log(json_data['errCode']); if (json_data['errCode']==0) { uni.showToast({ title: json_data['error_message'], icon:'none', duration: 2000 }); } else{ }
測試截圖
完整的index.vue
<template> <view style="width: 750rpx;height: 200rpx;display: flex;flex-direction: column;"> 上傳的檔名: <button type="primary" style="width: 500rpx;" @click="upload">點選上傳</button> </view> </template> <script> export default { data() { return { title: 'Hello' } }, onLoad() { let that=this; uni.request({ url: 'https://api.uomg.com/api/qq.info', //僅為範例,並非真實介面地址。 data: { qq: '504113939' }, header: { 'Content-Type': 'application/json;charset=UTF-8' //自定義請求頭資訊 }, success: (res) => { console.log(res.data); } }); }, methods: { upload(){ let that=this; console.log("我被點選了"); uni.chooseImage({ success: (chooseImageRes) => { const tempFilePaths = chooseImageRes.tempFilePaths; console.log(tempFilePaths); uni.uploadFile({ url: 'https:/你的介面/tp_imgsrc.php', //僅為範例,非真實的介面地址 filePath: tempFilePaths[0], name: 'file', formData: { }, success: (uploadFileRes) => { let json_data = JSON.parse(uploadFileRes.data) console.log(json_data['errCode']); if (json_data['errCode']==0) { uni.showToast({ title: json_data['error_message'], icon:'none', duration: 2000 }); } else{ } } }); } }); }, } } </script> <style> .content { display: flex; flex-direction: column; align-items: center; justify-content: center; } .logo { height: 200rpx; width: 200rpx; margin-top: 200rpx; margin-left: auto; margin-right: auto; margin-bottom: 50rpx; } .text-area { display: flex; justify-content: center; } .title { font-size: 36rpx; color: #8f8f94; } </style>
到此這篇關於微信小程式uploadFile介面實現檔案上傳的文章就介紹到這了,更多相關小程式uploadFile內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45