当前位置:   article > 正文

微信小程序原生上传图片和预览+云函数上传_小程序原生实现上传图片

小程序原生实现上传图片

1.前台页面

1.1wxml问阿金

  1. <!-- 说明一个上传页面的按钮 -->
  2. <button type="primary" bindtap="uploadPage">上传页面展示</button>
  3. <!-- 声明一个上传服务器的按钮 -->
  4. <button type="warn" bindtap="uploadSever">上传服务器</button>
  5. <!-- 实现点击图片有个预览效果 -->
  6. <view wx:for="{{imgSrcArr}}" bindtap="uploadPreview" wx:key="index" class="img">
  7. <!-- 动态展示图片 -->
  8. <image class="pic" src="{{item.tempFilePath}}" />
  9. <!-- 删除图片 -->
  10. <!-- catchtap并阻止其冒泡到父元素,因为父元素有updatePreview时间 -->
  11. <view class="delete-button" catchtap="deleteImage" data-index="{{index}}">删除</view>
  12. </view>

展示

 

 

1.2js文件

1.2.1 uploadPage

说明:调用方法就是属性值是一个函数,因此要注意this问题。要将this指向原来的位置。

  1. uploadPage() {
  2. // 改变this,特别是调用方法
  3. // 说明:调用方法就是属性值是一个函数,因此要注意this问题
  4. let that = this
  5. wx.chooseMedia({
  6. count: 9, //表示可以选择的最大图片数量限制,这里设置为 9 表示最多可以选择 9 张图片
  7. mediaType: ['image'], //表示媒体文件的类型,在这里设置为 ['image'] 表示只能选择图片类型的文件
  8. sourceType: ['album', 'camera'], //表示可以选择的媒体来源,这里设置为 ['album', 'camera'] 表示可以从相册或相机进行选择
  9. camera: 'back', //表示前后摄像头的选择,默认为后置摄像头。当然设置的就是后置摄像头
  10. success(res) {
  11. that.setData({
  12. // 可以上传多张图,通过es6解构数组的方式
  13. imgSrcArr: [...that.data.imgSrcArr, ...res.tempFiles]
  14. })
  15. }
  16. })
  17. },

展示 

说明:点击上传页面展示,在这里我点击了两次 !

 

1.2.2uploadPreview

说明:需要学习Array.map方法的使用。

  1. // 图片预览
  2. uploadPreview() {
  3. let that = this
  4. wx.previewImage({
  5. current: "", // 当前显示图片的http链接
  6. // 说明map方法就是遍历数字然后生成一个新的数组,item就是遍历的数组里面的对象,返回tempFilePath
  7. urls: that.data.imgSrcArr.map(item => item.tempFilePath)
  8. // 需要预览的图片http链接列表,[url,url]这样的
  9. })
  10. },

 展示

说明:点击图片后全屏显示 

1.2.3deleteImage按钮

说明:点击删除按钮删除图片

  1. // 删除图片
  2. deleteImage(event) {
  3. // 解构拿到数组的索引
  4. const {
  5. index
  6. } = event.currentTarget.dataset;
  7. // 拿到图片数组
  8. const {
  9. imgSrcArr
  10. } = this.data;
  11. // 删除当前索引,删除长度为1
  12. imgSrcArr.splice(index, 1);
  13. this.setData({
  14. imgSrcArr: imgSrcArr
  15. });
  16. },

sass文件

  1. // 图片
  2. .img {
  3. position: relative;
  4. .pic {}
  5. // 图片里面的按钮
  6. .delete-button {
  7. position: absolute;
  8. top: 0;
  9. right: 0;
  10. padding: 4px;
  11. font-size: 15px;
  12. color: #ffffff;
  13. background-color: #BDA066;
  14. border-radius: 5px;
  15. }
  16. }

  

说明:如果不写catchtap="deleteImage",因为事件冒泡到了父元素,触发了uploadPreview事件。

1.2.4 上传图片到服务器

说明:使用原生的上传图片目前我只能一张一张上传,因此我是采用了map方法使用,遍历数组每个值,进行上传。

  1. uploadSever() {
  2. let that = this
  3. //拿到图片的url地址,map使用
  4. that.data.imgSrcArr.map(item => {
  5. wx.uploadFile({
  6. url: '***********', //服务器地址
  7. //图片的地址
  8. filePath: item.tempFilePath,
  9. // 前台必须传递image,后台规定的字段。
  10. name: 'image',
  11. success(res) {
  12. console.log(res);
  13. }
  14. })
  15. })
  16. },

 展示,图片存在云数据库的位置

 2.后端逻辑

说明:为了自己能够看,不再阐释说明。

  1. import cloud from '@lafjs/cloud'
  2. import { S3, PutObjectCommand } from "@aws-sdk/client-s3";
  3. import fs from 'fs'
  4. const s3 = new S3({
  5. endpoint: cloud.env.OSS_EXTERNAL_ENDPOINT,
  6. region: cloud.env.OSS_REGION,
  7. credentials: {
  8. accessKeyId: cloud.env.OSS_ACCESS_KEY,
  9. secretAccessKey: cloud.env.OSS_ACCESS_SECRET,
  10. },
  11. forcePathStyle: true,
  12. });
  13. // 正文开始,这才是内容
  14. export async function main(ctx: FunctionContext) {
  15. const image = ctx.files[0]
  16. // 判断前台上传的图片是否包含 images 字段
  17. if (image.fieldname !== "image") {
  18. // 如果不存在 images 字段,则返回错误信息
  19. return {
  20. statusCode: 400,
  21. body: JSON.stringify({
  22. error: 'Missing images field in the request.'
  23. })
  24. };
  25. }
  26. // 将图片的临时位置读取了
  27. const fileContent = fs.readFileSync(image.path); // 能够上传成功,展示图片是花的
  28. const bucket = "”************************"; // 这里改成你要上传的云储存名称
  29. // 文件的路径,存储位置就是images文件夹
  30. const path = "/images/" + image.filename
  31. const command = new PutObjectCommand({
  32. // 储存桶的位置
  33. Bucket: bucket,
  34. // 文件的路径
  35. Key: path,
  36. Body: fileContent,
  37. ContentType: image.mimetype,
  38. });
  39. let res
  40. try {
  41. res = await s3.send(command)
  42. // console.log("文件上传成功:", res);
  43. } catch (error) {
  44. return error
  45. }
  46. let { $metadata: { httpStatusCode } } = res
  47. let { filename } = ctx.files[0]
  48. let fileObject = { httpStatusCode, filename }
  49. return fileObject
  50. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/325953
推荐阅读
相关标签
  

闽ICP备14008679号