应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

uni-app 微信小程序 上传图片文件,uniapp。uni-file-picker 和数据一起上传图片,上传图片的时候携带数据。多图上传

178人阅读 2023/9/17 23:00 总访问:5182875 评论:0 收藏:0 手机
分类: 前端

uni-app中上传图片可以使用方法uni.uploadFile

uni.uploadFile官方文档:
https://uniapp.dcloud.net.cn/api/request/network-file.html

如果是支持图片和视频的上传可以使用uni.chooseMedia,官方文档:
https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia

这里借助了uni.chooseImage来选择图片,然后使用uni.uploadFile调用了上传图片的接口实现上传,大致的使用方法为

  1. uni.chooseImage({
  2. success: (chooseImageRes) => {
  3. const tempFilePaths = chooseImageRes.tempFilePaths;
  4. uni.uploadFile({
  5. url: 'https://www.xxyy.com/api/upload', //你后端的上传地址
  6. filePath: tempFilePaths[0],
  7. name: 'file',//后端接收图片上传的名称,后端有些接收写法需要保持一致
  8. formData: {
  9. 'user': 'aj',
  10. 'truckDriverId':66
  11. },//其它上传参数
  12. success: (uploadFileRes) => {
  13. console.log(uploadFileRes.data);
  14. }
  15. });
  16. }
  17. });

在多贴一个使用uni.uploadFile上传图片的示例,里边包含传递token的:

  1. // 上传签字图片
  2. const uploadFile = (_filePath:any)=>{
  3. uni.uploadFile({
  4. // 请求接口地址
  5. url: ApiBaseUrl + '/oss/api/SmartFiles/UpLoadFormXXX',
  6. filePath: _filePath,
  7. name: 'file',
  8. header: {
  9. 'Authorization': `Bearer ${getToken()}`,
  10. },
  11. formData: {
  12. 'bucketName': 'teacher-certification',
  13. 'filePath': 'teacherTraining',
  14. 'fileType': '1'
  15. },
  16. success: (uploadFileRes:any) => {
  17. let result = JSON.parse(uploadFileRes.data)
  18. // 下面是图片上传成功之后配合其他接口的操作
  19. // state.UpLoadData.Sign = result.data.id
  20. // submitUpload()
  21. }
  22. });
  23. }

如果是.net 6的后端接收图片可以这样写,后端这样写的话name就要后后端的命名保持一致了。

主要的结构如下:

  1. <view class="avatar" @click="HeadUpload">上头像传</view>
  2. <script>
  3. ...
  4. methods:{
  5. HeadUpload(){
  6. uni.chooseImage(){
  7. ....
  8. }
  9. }
  10. }
  11. </script>

然后上传成功后还需要自己处理图片的显示什么的,不然不能看到图片上传的效果,还是挺麻烦的。所以,为了方便,我们可以使用uni-file-picker+uni.uploadFile组合。用uni-file-picker来选择图片,它自己就自带了图片的预览和放大以及删除等功能。当然如果是一些比较简单的单图的上传,比如上传头像什么的,其实直接使用uni.chooseImage和uni.uploadFile基本就够用了。

使用uni-file-picker+uni.uploadFile组合上传图片文件等

先引入uni-file-picker控件后,使用一下

  1. <uni-file-picker limit="1" title="请选择图片" @select="upload($event)":auto-upload="false"></uni-file-picker>

这里限制了只能传递一张图片,显示的效果如下,这个组件自带了很多功能还是很方便的。

我们在@select图片选择事件里边加入了upload方法,该方法如下:

  1. upload(e) {
  2. let url = apiUrl + "api/TruckScale/Add";
  3. const tempFilePaths = e.tempFilePaths; //e是获取的图片源
  4. console.log(tempFilePaths[0])
  5. uni.uploadFile({
  6. url: url, //上传图片的后端接口
  7. filePath: tempFilePaths[0],
  8. header: {
  9. 'Authorization': `Bearer ${login.getValue("token")}`,
  10. },
  11. formData: this.valiFormData, //其它上传参数,根据情况自己控制
  12. name: 'file',
  13. success: res => {
  14. console.log("上传成功了",res)
  15. //this.formData.avatar = res.data
  16. }
  17. })
  18. }

这样我们一选择就可以直接调用uni.uploadFile上传图片了,但是如果我们并不想一选择图片就直接上传了,而是选择了图片还要填写一些数据后,点击提交按钮,才把数据和图片一起提交到后台,我们就可以在选择事件里边把图片信息记录下来,而不是在选择事件里边直接上传了。

使用uni-file-picker+uni.uploadFile实现图片和数据一起上传

实现填写好资料,选择图片之后在点击提交按钮,在把数据和图片一起提交到后台

先写好uni-file-picker控件

  1. <uni-file-picker limit="1" title="请选择图片" @select="selectFileFun($event)" @delete="pickerDelete($event)" :auto-upload="false"></uni-file-picker>

主要是看@select选择图片的事件,我们是把选择的图片存储起来而不是直接提交

  1. //选择图片
  2. selectFileFun(e) {
  3. // 把图片存储到集合里边备用
  4. e.tempFilePaths.map(item => {
  5. this.imageList.push(item)
  6. })
  7. console.log("选择的图片", this.imageList)
  8. },
  1. data() {
  2. return {
  3. imageList: [] // 存放临时选择的图片信息
  4. }
  5. },

然后在提交按钮里边去调用上传图片的方法即可
这里有配合表单验证,因为我们除了需要传递图片之外还需要传递表单的数据

  1. submit(ref) {
  2. let _this = this
  3. //console.log("看看图片集合", _this.imageList)
  4. //console.log("看看图片地址", _this.imageList[0])
  5. this.$refs[ref].validate().then(res => {
  6. console.log('success', res);
  7. let url = apiUrl + "api/TruckScale/Add";
  8. uni.uploadFile({
  9. url: url,
  10. filePath: _this.imageList[0],
  11. formData: this.valiFormData, //其它上传参数
  12. name: 'file', //这里上传的名字也不能乱写哦,和后台保持一致
  13. header: {
  14. 'Authorization': `Bearer ${login.getValue("token")}`,
  15. },
  16. success: (res) => {
  17. console.log("上传成功!!")
  18. console.log(res)
  19. },
  20. fail: error => {
  21. console.log("上传失败!", error)
  22. uni.showModal({
  23. title: '提示',
  24. content: error,
  25. showCancel: false
  26. });
  27. uni.hideLoading();
  28. },
  29. complete: () => {
  30. uni.hideLoading();
  31. }
  32. });
  33. }).catch(err => {
  34. console.log('err', err);
  35. })
  36. },

删除图片那个事件处理方法也贴一下把,就是从集合里边删除即可:

  1. // 删除图片
  2. pickerDelete(e) {
  3. this.imageList.map((item, i) => {
  4. if (item == e.tempFilePath) {
  5. this.imageList.splice(i, 1)
  6. }
  7. })
  8. },

多图的上传

当然先把uni-file-picker控件的limit修改为大于1

  1. <uni-file-picker limit="3" title="请选择图片" @select="selectFileFun($event)" @delete="pickerDelete($event)" :auto-upload="false"></uni-file-picker>

看官方文档中关于uploadFile的介绍:
https://uniapp.dcloud.net.cn/api/request/network-file.html

可以使用files一次性传递多个图片,但是要注意后面的说明貌似只支持App和H5,微信小程序应该是不支持这样的方式实现多图或者多文件上传的

先介绍一下这种方式的使用,其实和单张上传很类似的,但是要注意多图上传的时候imageList就不能只给一个地址了,还需要给一个名称,也就是我们需要修改一下选择图片事件里边的逻辑,记录的时候多记录一下名称

  1. // 选择图片
  2. selectFileFun(e) {
  3. // 选择文件目前只支持 H5 和 微信小程序平台 ,
  4. // 且 微信小程序平台 使用 wx.chooseMessageFile()
  5. e.tempFilePaths.map(item => {
  6. this.imageList.push({
  7. name: 'imageList',
  8. uri: item
  9. })
  10. })
  11. console.log("选择的图片", this.imageList)
  12. },

可以看到这里我们记录了name和地址uri,但是上传的时候就直接把这个imageList传递回去即可:

  1. submit(ref) {
  2. let _this = this
  3. this.$refs[ref].validate().then(res => {
  4. console.log('success', res);
  5. let url = apiUrl + "api/TruckScale/BatchAdd";
  6. uni.uploadFile({
  7. url: url,
  8. files: _this.imageList,//多图上传使用files
  9. // filePath: _this.imageList[0],
  10. name: 'files', //这里上传的名字也不能乱写哦,和后台保持一致
  11. formData: this.valiFormData, //其它上传参数
  12. header: {
  13. 'Authorization': `Bearer ${login.getValue("token")}`,
  14. },
  15. success: (res) => {
  16. console.log("上传成功!")
  17. console.log(res)
  18. },
  19. fail: error => {
  20. console.log("上传失败!", error)
  21. uni.showModal({
  22. title: '提示',
  23. content: error,
  24. showCancel: false
  25. });
  26. uni.hideLoading();
  27. },
  28. complete: () => {
  29. uni.hideLoading();
  30. }
  31. });
  32. }).catch(err => {
  33. console.log('err', err);
  34. })
  35. },

.net6后台也简单贴一下:

  1. // 多图上传
  2. [HttpPost]
  3. [ApiDescriptionSettings(Name = "BatchAdd")]
  4. public async Task BatchAdd([FromForm] AddTruckScaleInput input)
  5. {
  6. var request = App.HttpContext.Request;
  7. IFormFileCollection cols = request.Form.Files;
  8. List<IFormFile> formFiles = new List<IFormFile>();
  9. foreach (IFormFile file in cols)
  10. {
  11. formFiles.Add(file);
  12. }
  13. // 调用封装的多图上传方法,这个根据自己的情况修改即可
  14. var fileRes = await _fileService.UploadFiles(formFiles, "Upload/Scale");
  15. }

使用request.Form.Files即可获取前台传递的多图,调用自己的方法存储即可。

删除图片那个事件处理方法也贴一下把,就是从集合里边删除即可:
这里和单独删除哪里有一点点区别就是不能直接去判断了,需要使用item.uri才是图片地址

  1. // 删除图片
  2. pickerDelete(e) {
  3. this.imageList.map((item, i) => {
  4. if (item.uri == e.tempFilePath) {
  5. this.imageList.splice(i, 1)
  6. }
  7. })
  8. },

当然至于微信小程序不支持多图上传可以考虑其他方式,比如官方介绍的可以使用循环调用单图上传的方式。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

uni-app开始时间与结束时间(结束时间大于开始时间)picker编写

利用uni-app官网里面picker插件代码当点击开始时间后结束时间要大于选择后的开始时间,点击结束时间后开始时间要小于开始时...

uni-app用法与html标签的变化

以前是html标签,比如,现在是小程序组件,比如。那么标签和组件有什么区别,不都是用尖括号包围起来一段英文吗?其实标签...

uni-app无法导入插件

点击网页中右上角的插件导入,可以打开项目,但是就是无法导入插件。是因为,要登录!hbuilder里边也要登录才行,他这个应...

使用uni-app的云端一体插件

初次使用uni-app的云端一体插件步骤还是有点多,也有一些坑,在这里把使用过程记录一下。 一:先下载需要的插件在插件右上...

uni-app中list插件图标问题

如图:他使用uni-icons实现的如果只有text就不会有图标有时候贴的文档不是太完善,还是要下一个完整的插件来对比一下

uni-app发起请求

代码如下:uni.request({ url:&#39;接口地址&#39;, success:(result)=&gt;{ my.lists=result.data; } })注意你的...

uni-app官方文档

https://uniapp.dcloud.io/

uni-app运行与调试

上边有菜单,可以运行到浏览器,也可以运行到内置浏览器运行到内置浏览器的效果:

uni-app引入外部资源引入外网样式

很简单代码如下:&lt;style&gt; @import&#39;http://image.tnblog.net/amazeui.min.css&#39;; &lt;/style&gt; &lt;st...

uni-app设置起始页

很简单,在pages.json里边配置即可。

uni-app页面无法跳转问题

首先检查一下有没有在pages里边配置没有配置不行的哦或者看看你的跳转方式对不对,如果跳转的是底部菜单,但是你用的是uni....

uni-app 删除失败 setting denied access to....

删除的时候如果文件夹下面还有页面,这样直接删除文件夹是会报错的:删除失败 setting denied access to....这种情况就直接...

uni-app中引入外部js

可以使用代码如下:varscript=document.createElement(&#39;script&#39;); script.src=&quot;http://image.tnblog.net/jqu...

uni-app dom操作

比如引入外部js需要用到的dom操作:varscript=document.createElement(&#39;script&#39;); script.src=&quot;http://image....

uni-app使用web-view引入页面

代码如下:&lt;template&gt; &lt;viewclass=&quot;h5-html&quot;&gt; &lt;web-view:webview-styles=&quot;webviewStyl...

uni-app真机调试

很简单只要手机开启了usb调试,然后hbuilderx会自动获取到手机的然后运行到手机即可华为手机开启use调试:一直点击版本号进...