使用uniapp拍照上傳的實現

一、介紹

隨著移動互聯網的普及,手機成為了人們最主要的瀏覽終端。對於進行一些數據錄入,例如頭像、申請表等,拍照上傳成為了一個非常實用的方式。本文將介紹如何使用uniapp實現拍照上傳功能。

二、前置條件

為了實現拍照上傳,我們需要拍照功能和上傳功能的支持。在uniapp中,我們可以使用uni-ui提供的camera組件實現拍照功能,使用uni.request實現上傳功能。同時,我們需要有一個後台伺服器,用來存儲上傳的照片。

三、實現拍照功能

首先,在需要拍照上傳的頁面中引用uni-ui的camera組件。在template中加入以下代碼:

<template>
  <view>
    <camera style="width: 100%; height: 400rpx;" device-position="front"
      bind:stop="onCameraStop" wx:if="{{ cameraAuthorized }}" />
    <view class="container" wx:else>
      <button type="primary" size="default" bind:tap="openSetting">打開相機許可權</button>
    </view>
  </view>
</template>

<script>
  import uniPermissions from '@/common/uni-permissions.js' // 引入uni-permissions.js
  import uniPopup from '@/common/uni-popup.js' // 引入uni-popup.js

  export default {
    data() {
      return {
        cameraAuthorized: true // 判斷相機許可權
      };
    },
    onLoad() {
      this.checkCameraAuthorize(); // onload時檢查相機許可權
    },
    methods: {
      openSetting() { // 用戶點擊打開相機許可權的按鈕
        uniPermissions.openSetting();
      },
      checkCameraAuthorize() { // 檢查相機許可權
        uniPermissions.checkAuthorize('camera', {
          onResult: res => {
            this.cameraAuthorized = res.authorized;
            if (!res.authorized) {
              uniPopup.showModal('提示', '相機許可權未開啟,是否前往許可權設置?', () => {
                  uniPermissions.openSetting();
                }, () => {}, true);
            }
          }
        });
      },
      onCameraStop(e) {
        uni.saveFile({
          tempFilePath: e.tempImagePath,
          success: function (res) {
            uni.showToast({
              title: '保存成功',
              icon: 'success',
              duration: 2000
            });
          },
          fail: function (res) {
             uni.showToast({
              title: '保存失敗',
              icon: 'none',
              duration: 2000
            });
          }
        });
      }
    }
  };
</script>

<style>
  .container {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    height: {{ windowHeight - navigationBarHeight }}px;
    color: #8f8f94;
    background-color: #ffffff;
  }
</style>

在上面的代碼中,我們使用了uniPermissions和uniPopup兩個自定義組件。這兩個組件的使用方法可以在github找到。

四、實現上傳功能

在實現上傳功能之前,我們需要定義一個後台介面,用來接收上傳的文件,將其存儲到伺服器上,並返迴文件的url。在後台介面定義好之後,我們再來實現上傳功能。

我們使用uni.request方法來上傳文件。在點擊上傳按鈕之後,調用以下代碼:

<button type="primary" bind:tap="onUploadClick">上傳</button>

<script>
  export default {
    methods: {
      onUploadClick() {
        uni.chooseImage({
          success: (res) => {
            uni.showLoading({
              title: '上傳中...'
            });

            let filePath = res.tempFilePaths[0];
            uni.uploadFile({
              url: '後台介面url',
              filePath: filePath,
              name: 'file',
              success: (res) => {
                uni.hideLoading();
                uni.showToast({
                  title: '上傳成功',
                  icon: 'success',
                  duration: 2000
                });
              },
              fail: (res) => {
                uni.hideLoading();
                uni.showToast({
                  title: '上傳失敗',
                  icon: 'none',
                  duration: 2000
                });
              }
            });
          }
        });
      }
    }
  };
</script>

五、完整代碼示例

下面是拍照上傳的完整代碼示例:

<template>
  <view>
    <camera style="width: 100%; height: 400rpx;" device-position="front"
      bind:stop="onCameraStop" wx:if="{{ cameraAuthorized }}" />
    <view class="container" wx:else>
      <button type="primary" size="default" bind:tap="openSetting">打開相機許可權</button>
    </view>
    <button type="primary" bind:tap="onUploadClick">上傳</button>
  </view>
</template>

<script>
  import uniPermissions from '@/common/uni-permissions.js' // 引入uni-permissions.js
  import uniPopup from '@/common/uni-popup.js' // 引入uni-popup.js

  export default {
    data() {
      return {
        cameraAuthorized: true // 判斷相機許可權
      };
    },
    onLoad() {
      this.checkCameraAuthorize(); // onload時檢查相機許可權
    },
    methods: {
      openSetting() { // 用戶點擊打開相機許可權的按鈕
        uniPermissions.openSetting();
      },
      checkCameraAuthorize() { // 檢查相機許可權
        uniPermissions.checkAuthorize('camera', {
          onResult: res => {
            this.cameraAuthorized = res.authorized;
            if (!res.authorized) {
              uniPopup.showModal('提示', '相機許可權未開啟,是否前往許可權設置?', () => {
                  uniPermissions.openSetting();
                }, () => {}, true);
            }
          }
        });
      },
      onCameraStop(e) {
        uni.saveFile({
          tempFilePath: e.tempImagePath,
          success: function (res) {
            uni.showToast({
              title: '保存成功',
              icon: 'success',
              duration: 2000
            });
          },
          fail: function (res) {
             uni.showToast({
              title: '保存失敗',
              icon: 'none',
              duration: 2000
            });
          }
        });
      },
      onUploadClick() {
        uni.chooseImage({
          success: (res) => {
            uni.showLoading({
              title: '上傳中...'
            });

            let filePath = res.tempFilePaths[0];
            uni.uploadFile({
              url: '後台介面url',
              filePath: filePath,
              name: 'file',
              success: (res) => {
                uni.hideLoading();
                uni.showToast({
                  title: '上傳成功',
                  icon: 'success',
                  duration: 2000
                });
              },
              fail: (res) => {
                uni.hideLoading();
                uni.showToast({
                  title: '上傳失敗',
                  icon: 'none',
                  duration: 2000
                });
              }
            });
          }
        });
      }
    }
  };
</script>

<style>
  .container {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    height: {{ windowHeight - navigationBarHeight }}px;
    color: #8f8f94;
    background-color: #ffffff;
  }
</style>

原創文章,作者:PVAJK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330756.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PVAJK的頭像PVAJK
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • 百度網盤Python上傳

    百度網盤是一個常用的雲存儲平台,提供了多種上傳文件的方式,其中包括使用Python進行上傳。本文將從安裝Python、安裝依賴庫、上傳文件三個方面進行詳細闡述。 一、安裝Pytho…

    編程 2025-04-28
  • 如何使用git拉出某個用戶上傳的文件?

    Git是一個非常流行的版本控制系統,它可以幫助團隊協作,並保證代碼的版本控制。有時候,我們需要拉出某個用戶上傳的文件,但不知道從哪裡開始。本文將會從多個方面詳細闡述如何使用git拉…

    編程 2025-04-28
  • 上傳多媒體文件的常用方法——uploadmediabyurl

    uploadmediabyurl是一個非常常用的方法,它允許我們將本地的多媒體文件上傳到微信伺服器上。 一、uploadmediabyurl的基本使用方法 要使用uploadmed…

    編程 2025-04-27
  • NB設備上傳數據方案

    NB(Narrow Band)是一種物聯網通信技術,可以實現低功耗、寬覆蓋、多連接等特點。本文旨在探討如何使用NB設備上傳數據。在這篇文章中,我們將介紹NB設備上傳數據的基本原理、…

    編程 2025-04-27
  • Python上傳ftp文件用法介紹

    本文將從多個方面詳細闡述Python上傳ftp文件的方法和注意事項,幫助讀者快速掌握如何使用Python上傳ftp文件。 一、安裝ftplib庫 首先,在Python中使用ftp上…

    編程 2025-04-27
  • uniapp分頁第二次請求用法介紹

    本文將從多個方面對uniapp分頁第二次請求進行詳細闡述,並給出對應的代碼示例。 一、請求參數的構造 在進行分頁請求時,需要傳遞的參數體包含當前頁碼以及每頁顯示的數據量。對於第二次…

    編程 2025-04-27
  • uniapp ios打包詳解

    一、環境搭建 首先需要安裝Xcode,並在Xcode中登錄自己的Apple ID,開啟自己的開發者賬戶。 接著,需要在uniapp項目中配置簽名證書和描述文件。步驟如下: 在Xco…

    編程 2025-04-25
  • uniapp導航欄字體大小探究

    隨著移動端應用的發展,導航欄越來越成為移動應用中一個重要的組成部分。在如此眾多的移動端開發框架中,uniapp已經成為了很多開發者的首選。在uniapp中,導航欄也是一個非常重要的…

    編程 2025-04-25
  • 全面解析uniapp如何獲取當前位置

    一、uniapp使用定位API實現實時定位 1、uniapp提供的定位API可以獲取當前設備位置,使用方法如下: // 開啟實時定位 uni.startLocationUpdate…

    編程 2025-04-25
  • uniapp面試題解析

    一、uniapp簡介 uniapp是一種基於vue.js框架的開源跨平台開發框架,可以讓開發者使用vue的語法在多個平台上進行一次編譯即可生成iOS、Android、Web和小程序…

    編程 2025-04-25

發表回復

登錄後才能評論