当前位置:   article > 正文

小程序中使用上传图片,显示、删除、预览_小程序上传图片

小程序上传图片

一、功能介绍

需要哦用户点击加号上传图片,并展示所上传图片和能够删除和预览

二、功能实现

采用的uniapp,创建了一个view容器包裹加号图标和展示的图片。

内部展示图片超过9张时候,加号图片隐藏

  1. <view class="img-list">
  2. //图片显示列表,循环展示
  3. <view v-for="(item,index) in pushData.photoList"
  4. :key='index' class="img-list-box">
  5. //图片展示和图片点击唤醒uni的预览删除
  6. <image :src="item" mode="aspectFit"
  7. class="img-item" @tap="imgTypeSelect(item)">
  8. </image>
  9. </view>
  10. //加号添加图,样式自定义就好
  11. <view v-if="pushData.photoList.length < 9"
  12. class="icon-camera"
  13. @tap="selectType">
  14. </view>
  15. </view>

点击加号

唤起uni的向上弹出操作菜单

uni.showActionSheet(OBJECT)

点击后又使用看图片选择API

从底部向上弹出操作菜单

OBJECT参数说明

参数类型必填说明平台差异说明
titleString菜单标题App、H5、支付宝小程序、钉钉小程序、微信小程序 3.4.5+(仅真机有效)
alertTextString警示文案(同菜单标题)微信小程序(仅真机有效)
itemListArray<String>按钮的文字数组微信、百度、抖音小程序数组长度最大为6个
itemColorHexColor按钮的文字颜色,字符串格式,默认为"#000000"App-iOS、飞书小程序不支持
popoverObject大屏设备弹出原生选择按钮框的指示区域,默认居中显示App-iPad(2.6.6+)、H5(2.9.2)
successFunction接口调用成功的回调函数,详见返回参数说明
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

popover 值说明(仅App生效)

类型说明
topNumber指示区域坐标,使用原生 navigationBar 时一般需要加上 navigationBar 的高度
leftNumber指示区域坐标
widthNumber指示区域宽度
heightNumber指示区域高度

success返回参数说明

参数类型说明
tapIndexNumber用户点击的按钮,从上到下的顺序,从0开始

示例

  1. uni.showActionSheet({
  2. itemList: ['A', 'B', 'C'],
  3. success: function (res) {
  4. console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
  5. },
  6. fail: function (res) {
  7. console.log(res.errMsg);
  8. }
  9. });

实际代码

  1. selectType() {
  2. let that = this
  3. let itemL = ['拍照', '从相册选择照片']
  4. uni.showActionSheet({
  5. itemList: itemL,
  6. success: function(res) {
  7. if (res.tapIndex == 0) {
  8. uni.chooseImage({
  9. sourceType: ['camera'], // 拍照选择
  10. success: function(res) {
  11. res.tempFilePaths.forEach(path => {
  12. uni.uploadFile({
  13. url: '11111111', //后端接口地址
  14. filePath: path,
  15. name: 'file',
  16. formData: {
  17. },
  18. header: {
  19. 'content-type': 'multipart/form-data',
  20. },
  21. success: function(uploadFile) {
  22. let uploadFiles = JSON.parse(
  23. uploadFile.data)
  24. that.pushData.photoList.push(
  25. uploadFiles.data);
  26. }
  27. })
  28. })
  29. }
  30. });
  31. }
  32. if (res.tapIndex == 1) {
  33. uni.chooseImage({
  34. count: 9 - that.pushData.photoList.length,
  35. sourceType: ['album'], //从相册选择
  36. success: function(res) {
  37. res.tempFilePaths.forEach(path => {
  38. uni.uploadFile({
  39. url: 'https:1111111', //后端接口地址
  40. filePath: path,
  41. name: 'file',
  42. formData: {
  43. },
  44. header: {
  45. 'content-type': 'multipart/form-data',
  46. },
  47. success: function(uploadFile) {
  48. let uploadFiles = JSON.parse(
  49. uploadFile.data)
  50. that.pushData.photoList.push(
  51. uploadFiles.data);
  52. }
  53. })
  54. })
  55. }
  56. });
  57. }

从本地相册选择图片或使用相机拍照。

uni.chooseImage(OBJECT)

App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考plus.camera

微信小程序从基础库 2.21.0 开始, wx.chooseImage 停止维护,请使用 uni.chooseMedia 代替。

OBJECT 参数说明

参数名类型必填说明平台差异说明
countNumber最多可以选择的图片张数,默认9见下方说明
sizeTypeArray<String>original 原图,compressed 压缩图,默认二者都有App、微信小程序、支付宝小程序、百度小程序
extensionArray<String>根据文件拓展名过滤,每一项都不能是空字符串。默认不过滤。H5(HBuilder X2.9.9+)
sourceTypeArray<String>album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
cropObject图像裁剪参数,设置后 sizeType 失效App 3.1.19+
successFunction成功则返回图片的本地文件路径列表 tempFilePaths
failFunction接口调用失败的回调函数小程序、App
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

crop 参数说明

参数名类型必填说明平台差异说明
qualityNumber取值范围为1-100,数值越小,质量越低(仅对jpg格式有效)。默认值为80。
widthNumber裁剪的宽度,单位为px,用于计算裁剪宽高比。
heightNumber裁剪的高度,单位为px,用于计算裁剪宽高比。
resizeBoolean是否将width和height作为裁剪保存图片真实的像素值。默认值为true。注:设置为false时在裁剪编辑界面显示图片的像素值,设置为true时不显示

success 返回参数说明

参数类型说明
tempFilePathsArray<String>图片的本地文件路径列表
tempFilesArray<Object>、Array<File>图片的本地文件列表,每一项是一个 File 对象

File 对象结构如下

参数类型说明
pathString本地文件路径
sizeNumber本地文件大小,单位:B
nameString包含扩展名的文件名称,仅H5支持
typeString文件类型,仅H5支持

选择图片后继续调用上传接口

uni.uploadFile(OBJECT)

将本地资源上传到开发者服务器,客户端发起一个 POST 请求,其中 content-type 为 multipart/form-data。 如页面通过 uni.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器。另外选择和上传非图像、视频文件参考:uni-app 选择和上传非图像、视频文件 - DCloud问答

OBJECT 参数说明

参数名类型必填说明平台差异说明
urlString开发者服务器 url
filesArray是(files和filePath选其一)需要上传的文件列表。使用 files 时,filePath 和 name 不生效。App、H5( 2.6.15+)
fileTypeString见平台差异说明文件类型,image/video/audio仅支付宝小程序,且必填。
fileFile要上传的文件对象。仅H5(2.6.15+)支持
filePathString是(files和filePath选其一)要上传文件资源的路径。
nameString文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
headerObjectHTTP 请求 Header, header 中不能设置 Referer。
timeoutNumber超时时间,单位 msH5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序、支付宝小程序、抖音小程序、快手小程序
formDataObjectHTTP 请求中其他额外的 form data
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

注意

  • App支持多文件上传,微信小程序只支持单文件上传,传多个文件需要反复调用本API。所以跨端的写法就是循环调用本API。

files参数说明

files 参数是一个 file 对象的数组,file 对象的结构如下:

参数名类型必填说明
nameStringmultipart 提交时,表单的项目名,默认为 file
fileFile要上传的文件对象,仅H5(2.6.15+)支持
uriString文件的本地地址

success 返回参数说明

参数类型说明
dataString开发者服务器返回的数据
statusCodeNumber开发者服务器返回的 HTTP 状态码

 

展示 图片和图片的点击预览删除

将图片上传后,获取到每一张上传的图片返回地址,push到展示的图片列表中

  1. <image :src="item" mode="aspectFit"
  2. class="img-item"
  3. @tap="imgTypeSelect(item)">
  4. </image>

点击图片后再次调用向上弹出交互API:uni.showActionSheet

利用点击图片本身的url进行数组寻找,点击预览调用

uni.previewImage(OBJECT)

预览图片。

这里对图片只是一个展示用,所以将存入的图片列表放入就可以预览

其他转发之类的需求可以参考文档中的

longPressActionsObject长按图片显示操作菜单,如不填默认为保存相册

点击删除按钮,则根据url寻找index进行列表的截取 

  1. // 图片状态选择
  2. imgTypeSelect(item) {
  3. let that = this
  4. uni.showActionSheet({
  5. itemList: ['预览', '删除'],
  6. success: function(res) {
  7. if (res.tapIndex == 0) {
  8. console.log('删除1', that.pushData.photoList);
  9. uni.previewImage({
  10. current: item,
  11. urls: that.pushData.photoList
  12. })
  13. }
  14. if (res.tapIndex == 1) {
  15. let index = that.pushData.photoList.findIndex(url =>
  16. url === item);
  17. if (index !== -1) {
  18. that.pushData.photoList.splice(index, 1);
  19. }
  20. }
  21. }
  22. });
  23. },

不太美观的css 

添加图标的css是采用背景图,自行替换或使用别的写法

 

  1. .icon-camera {
  2. display: flex;
  3. justify-content: center;
  4. align-items: center;
  5. width: 210rpx;
  6. height: 210rpx;
  7. border-radius: 6rpx;
  8. margin: 5rpx 0rpx 0rpx 5rpx;
  9. background-color: #f4f5f7;
  10. // image{
  11. // width: 100%;
  12. // height: 100%;
  13. // }
  14. background: url('../iconadd.png');
  15. background-size: 100%;
  16. }
  17. // 媒体列表
  18. .img-list {
  19. display: flex;
  20. flex-wrap: wrap;
  21. margin-bottom: 20rpx;
  22. }
  23. .img-list-box {
  24. display: flex;
  25. justify-content: center;
  26. align-items: center;
  27. position: relative;
  28. overflow: hidden;
  29. }
  30. .img-item {
  31. width: 210rpx;
  32. height: 210rpx;
  33. margin: 5rpx;
  34. border-radius: 6rpx
  35. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号