UNIAPP 实现的复杂功能:照相和上传图片到服务器

打印 上一主题 下一主题

主题 929|帖子 929|积分 2787

在许多移动应用中,照相并上传图片是一项常见的需求,比方用户头像上传、商品图片上传等。本文将介绍如何在 UNIAPP 中实现照相和上传图片到服务器的功能。该功能涉及到调用装备的摄像头、选择图片、上传图片文件到服务器并显示上传的效果。
功能形貌

该功能将允许用户:

  • 使用装备摄像头照相并选择图片。
  • 将选择的图片通过文件上传功能上传至服务器。
  • 上传图片后,展示图片上传的状态和上传后的图片链接。
功能要求


  • 选择图片或照相:允许用户通过摄像头照相或从相册中选择图片。
  • 上传图片:将选择的图片上传到服务器,支持发送文件和额外的表单数据。
  • 展示图片:上传乐成后,展示图片或图片链接。
  • 错误处理:如果上传失败,展示相应的错误信息。
技术栈


  • 照相与选择图片:使用 uni.chooseImage API 选择图片,支持从相册或照相。
  • 上传文件:使用 uni.uploadFile API 将选择的图片上传到服务器。
  • 展示图片:上传乐成后,展示图片链接或展示图片。
1. 前端代码实现

页面实现

  1. <!-- pages/upload/upload.vue -->
  2. <template>
  3.   <view class="container">
  4.     <view class="header">UNIAPP 图片上传功能</view>
  5.     <!-- 显示选中的图片 -->
  6.     <view class="image-preview">
  7.       <image :src="imageUrl" v-if="imageUrl" class="image-uploaded" />
  8.       <text v-if="!imageUrl">暂无图片</text>
  9.     </view>
  10.     <!-- 上传图片按钮 -->
  11.     <button @click="chooseImage" class="upload-button">选择图片</button>
  12.     <!-- 上传进度条 -->
  13.     <view v-if="isUploading" class="uploading-info">
  14.       <text>上传中... {{ uploadProgress }}%</text>
  15.       <progress :percent="uploadProgress" show-info></progress>
  16.     </view>
  17.     <!-- 上传成功提示 -->
  18.     <view v-if="uploadSuccess" class="upload-success">
  19.       <text>上传成功!</text>
  20.       <text>图片链接: {{ uploadedImageUrl }}</text>
  21.     </view>
  22.     <!-- 上传失败提示 -->
  23.     <view v-if="uploadError" class="upload-error">
  24.       <text>上传失败,请重试!</text>
  25.     </view>
  26.   </view>
  27. </template>
  28. <script>
  29. export default {
  30.   data() {
  31.     return {
  32.       imageUrl: '', // 用户选择的图片
  33.       isUploading: false, // 是否正在上传
  34.       uploadProgress: 0, // 上传进度
  35.       uploadSuccess: false, // 上传是否成功
  36.       uploadError: false, // 上传是否失败
  37.       uploadedImageUrl: '', // 上传成功后返回的图片URL
  38.     };
  39.   },
  40.   methods: {
  41.     // 选择图片或拍照
  42.     chooseImage() {
  43.       uni.chooseImage({
  44.         count: 1, // 选择1张图片
  45.         sourceType: ['album', 'camera'], // 支持从相册和摄像头选择
  46.         success: (res) => {
  47.           // 获取选择的图片路径
  48.           this.imageUrl = res.tempFilePaths[0];
  49.           this.uploadImage(this.imageUrl); // 上传图片
  50.         },
  51.         fail: (err) => {
  52.           uni.showToast({ title: '选择图片失败', icon: 'none' });
  53.         }
  54.       });
  55.     },
  56.     // 上传图片
  57.     uploadImage(filePath) {
  58.       this.isUploading = true;
  59.       this.uploadProgress = 0;
  60.       this.uploadSuccess = false;
  61.       this.uploadError = false;
  62.       // 假设的服务器地址
  63.       const uploadUrl = 'https://example.com/upload';
  64.       // 使用 uni.uploadFile 上传文件
  65.       uni.uploadFile({
  66.         url: uploadUrl,  // 服务器上传地址
  67.         filePath: filePath,  // 文件路径
  68.         name: 'file',  // 文件域名
  69.         formData: {
  70.           'user': 'example'  // 可以传递额外的表单数据
  71.         },
  72.         success: (uploadRes) => {
  73.           // 上传成功
  74.           const data = JSON.parse(uploadRes.data);
  75.           if (data.success) {
  76.             this.uploadSuccess = true;
  77.             this.uploadedImageUrl = data.imageUrl; // 假设返回图片的URL
  78.           } else {
  79.             this.uploadError = true;
  80.           }
  81.           this.isUploading = false;
  82.         },
  83.         fail: (err) => {
  84.           // 上传失败
  85.           this.uploadError = true;
  86.           this.isUploading = false;
  87.         },
  88.         // 上传进度回调
  89.         progress: (progressEvent) => {
  90.           if (progressEvent.lengthComputable) {
  91.             this.uploadProgress = Math.round((progressEvent.loaded / progressEvent.total) * 100);
  92.           }
  93.         }
  94.       });
  95.     }
  96.   }
  97. };
  98. </script>
  99. <style scoped>
  100. .container {
  101.   padding: 20px;
  102. }
  103. .header {
  104.   font-size: 24px;
  105.   text-align: center;
  106.   margin-bottom: 20px;
  107. }
  108. .image-preview {
  109.   text-align: center;
  110.   margin-bottom: 20px;
  111. }
  112. .image-uploaded {
  113.   width: 100%;
  114.   max-width: 300px;
  115.   margin-bottom: 20px;
  116. }
  117. .upload-button {
  118.   padding: 10px;
  119.   background-color: #007bff;
  120.   color: white;
  121.   border: none;
  122.   text-align: center;
  123.   margin-bottom: 20px;
  124. }
  125. .uploading-info {
  126.   margin-top: 20px;
  127. }
  128. .upload-success {
  129.   margin-top: 20px;
  130.   color: green;
  131. }
  132. .upload-error {
  133.   margin-top: 20px;
  134.   color: red;
  135. }
  136. </style>
复制代码
2. 使用分析

1. 选择图片或照相

用户可以点击“选择图片”按钮,从相册中选择一张图片或使用摄像头照相。选中的图片会展示在页面上。
2. 上传图片



  • 当用户选择完图片后,图片会立即开始上传,上传进度会及时显示在页面上。
  • uni.uploadFile 会将图片上传到服务器。在实际使用中,你需要更换 uploadUrl 为真实的服务器接口。
3. 显示上传状态



  • 在图片上传过程中,进度条会显示当前上传的进度(0%-100%)。
  • 上传乐成后,显示乐成提示以及返回的图片URL。
  • 上传失败时,页面会显示上传失败的提示,用户可以重试。
4. 错误处理

如果上传过程中发生错误,体系会通过 fail 回调处理,并显示上传失败的信息。
5. 测试与调试



  • 该功能需要在真实装备上举行测试,尤其是摄像头和图片选择部分。
  • 服务器端需要有一个可以接收文件上传的接口,并返回图片的URL,确保与客户端的上传接口一致。
3. 扩展功能


  • 多图上传:可以通过 chooseImage API 设置 count 为大于1的值,实现多图选择和上传。
  • 图片裁剪与编辑:用户可以在选择图片后举行裁剪、旋转或编辑,上传前对图片举行优化。
  • 文件类型与巨细限制:对上传的图片举行巨细和类型限制,确保上传的图片符合要求。
  • 上传汗青记载:用户上传过的图片可以展示汗青记载,方便查看。
总结

通过 UNIAPP 实现的这套图片上传功能,用户可以选择图片或照相并上传至服务器。该功能涉及到图片选择、文件上传、进度显示和错误处理等内容,适用于需要图片上传的各种应用场景。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表