首頁 > 軟體

微信小程式uploadFile介面實現檔案上傳

2022-08-23 18:00:33

寫在前面

上節中我們講到小程式的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: {}裡面

寫入js事件-完成上傳操作

接下來我們在剛剛建立測試的方法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介面檔案

在寫事件前,我通過在伺服器上新建一個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!


IT145.com E-mail:sddin#qq.com