SpringBoot+微信小程序实现文件上传与下载功能详解
作者:别团等shy哥发育 发布时间:2023-01-17 15:56:39
1、文件上传
1.1 后端部分
1.1.1 引入Apache Commons FIleUpload组件依赖
<!--文件上传与下载相关的依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
1.1.2 设置上传文件大小限制
在application.yml(根据个人情况,有的人可能用的properties)配置文件中添加如下参数:
1.1.3 创建控制器
后端部分很简单,就是实现文件上传而已,这个学过SpringMVC就行。
@ApiOperation("文件上传")
@PostMapping("/upload")
public String upload(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
if(!file.isEmpty()){
//上传文件路径
// String path = request.getServletContext().getRealPath("/uploadFiles/");
String path="E:/upload";
//获得上传文件名
String fileName = file.getOriginalFilename();
File filePath = new File(path + File.separator + fileName);
System.out.println(filePath);
//如果文件目录不存在,创建目录
if(!filePath.getParentFile().exists()){
filePath.getParentFile().mkdirs();
}
//将上传文件保存到一个目标文件中
file.transferTo(filePath);
return "success";
}
return "fail";
}
这里为了方便,我直接使用了绝对路径,生产环境中是不允许的。
1.2 小程序前端部分
wx.uploadFile(OBJECT)接口将本地资源上传到开发者的服务器上,客户端发起一个HTTPS的Post请求,其中content-type为multipart/form-data。在上传之前需要先获取本地(手机)上的资源,即使用wx.uploadFile(OBJECT)之前应该先调用其他的接口来获取待上传的文件资源,例如先调用wx.chooseImage()接口来获取到本地图片资源的临时文件路径,再通过wx.uploadFile(OBJECT)接口将本地资源上传到指定服务器。wx.uploadFile()接口属性如下表所示。
官网示例代码:
wx.chooseImage({
success (res) {
const tempFilePaths = res.tempFilePaths
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址
filePath: tempFilePaths[0],
name: 'file',
formData: {
'user': 'test'
},
success (res){
const data = res.data
//do something
}
})
}
})
真实的前端代码如下:
pages/uploadFile/uploadFile.wxml
<!--index.wxml-->
<view class="container">
<button bindtap='upfile'>选择上传文件</button>
</view>
pages/uploadFile/uploadFile.js
//index.js
//获取应用实例
var app = getApp()
Page({
data: {
},
//事件处理函数
upfile: function() {
console.log("--bindViewTap--")
wx.chooseImage({
success: function(res) {
var tempFilePaths = res.tempFilePaths
wx.uploadFile({
url: 'http://127.0.0.1:8001/file/upload',
header: { "Content-Type": "multipart/form-data" },
filePath: tempFilePaths[0],
name: 'file',
formData:{
},
success(res){
console.log(res.data);
}
})
}
})
},
onLoad: function () {
}
})
1.3 实现效果
编译之后:
点击上传文件,随便选择一张图片
可以看到,前端和后端项目的控制台都有对应的输出。
然后去对应的路径下面查找我们刚刚上传的文件
2、文件下载
2.1 后端部分
这里依赖和设置上传文件大小和上传部分一致,不重复了。
2.1.1 控制器
@ApiOperation("文件下载")
@GetMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("file") String fileName) throws IOException {
//下载文件路径
String path="E:/upload";
//构建将要下载的文件对象
File file = new File(path + File.separator + fileName);
//设置响应头
HttpHeaders headers=new HttpHeaders();
//下载显示的文件名,解决中文名称乱码问题
String downloadFileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
//通知浏览器以下载方式(attachment)打开文件
headers.setContentDispositionFormData("attachment",downloadFileName);
//定义以二进制流数据(最常见的文件下载)的形式下载返回文件数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用spring mvc框架的ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
}
2.2 小程序前端部分
wx.downloadFile(Object object)下载文件资源到本地(手机).客户端直接发起一个HTTPS GET请求,返回文件的本地临时路径。因为是临时路径,也就意味着用户不会直到真实的文件目录,所以下载到临时路径之后应该马上做后续的工作,例如把临时图片设置为头像,或者把临时文件通过别的接口真是保存到手机指定目录下。wx.downloadFile(Object object)参数如表所示。
官网示例代码:
下载的前端代码如下:
这里实现两个功能,一个实现把下载到的图片设置为头像,另一个将图片保存到手机本地。
pages/downloadFile/downloadFile.wxml
<!--index.wxml-->
<view class="container">
<view bindtap="dian" class="userinfo">
<image class="userinfo-avatar" src="{{avatar}}" background-size="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</view>
<view class="usermotto">
<image src='http://127.0.0.1:8001/file/download?file=ymwtyNjpeZq645b1d185a17eaa9a65398443fbc4f8dd.jpg' class="tu"></image>
<view bindtap='dian2'>下载上图</view>
</view>
</view>
pages/downloadFile/downloadFile.js
//index.js
//获取应用实例
var app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {},
avatar:null
},
//事件处理函数
dian: function() {
console.log("--bindViewTap--")
var that = this;
wx.downloadFile({
// url: 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3018968254,2801372361&fm=26&gp=0.jpg',
url:'http://127.0.0.1:8001/file/download?file=ymwtyNjpeZq645b1d185a17eaa9a65398443fbc4f8dd.jpg',
type: 'image',
success: function(res) {
console.log(res)
that.setData({avatar:res.tempFilePath})
}
})
},
onLoad: function () {
console.log('onLoad')
var that = this
//调用应用实例的方法获取全局数据
app.getUserInfo(function(userInfo){
//更新数据
that.setData({
userInfo:userInfo
})
})
},
dian2: function () {
wx.downloadFile({
url:'http://127.0.0.1:8001/file/download?file=ymwtyNjpeZq645b1d185a17eaa9a65398443fbc4f8dd.jpg',
success: function (res) {
console.log(res);
var rr = res.tempFilePath;
wx.saveImageToPhotosAlbum({
filePath: rr,
success(res) {
wx.showToast({
title: '保存成功',
icon: 'success',
duration: 2000
})
}
})
}
})
}
})
在函数dian()中调用了wx.downloadFile()接口,下载成功,图片就会保存在res.tempFilePath中,再把res.tempFilePath设置为头像。在函数dian2中,通过wx.saveImageToPhotosAlbum()接口把下载成功的图片保存到系统相册。
2.3 实现效果
这个图片是直接从服务器上下载的,可以点击下载将这个图片保存到本地
到这里,文件上传和下载就基本做完了。其实大多数都是后端的事情,接口写好就没啥大问题。不放心的可以先用swagger测试。
所有接口文档均来自官网
来源:https://blog.csdn.net/qq_43753724/article/details/123604857


猜你喜欢
- 本文实例总结了Android横竖屏切换相关技巧。分享给大家供大家参考,具体如下:一、禁止横竖屏切换Android横竖屏切换在手机开发中比较常
- 1.问题由来迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡
- 一般来说一个 HTML 文档有很多标签,比如“<html>”、“<body>”、“<table>”等,想
- 下载 Android SDK,官网:www.android.com 我相信很多人跟我一样,进不去。Android Studio 中文官网 w
- 本文实例为大家分享了C#实现影院售票系统的具体代码,供大家参考,具体内容如下本人认为此项目的难点有4点1.首先是将解析完的XML文件绑定到T
- 多个线程访问共享对象和数据的方式有两种情况:1、每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享
- 这个破碎动画,是一种类似小米系统删除应用时的 * 破碎效果的动画。效果图展示先来看下是怎样的动效,要是感觉不是理想的学习目标,就跳过,避免浪费
- Eclipse 中的 GitEclipse 附带了一个名为 Egit 的插件,它提供了一个非常完善的 Git 操作接口。 这个插件可以通过切
- 本文实例讲述了Android编程自定义菜单实现方法。分享给大家供大家参考,具体如下:在android开发的过程中系统自带的菜单往往满足不了开
- 这篇文章主要介绍了简单了解SpringCloud运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 为什么需要协程?协程可以简化异步编程,可以顺序地表达程序,协程也提供了一种避免阻塞线程并用更廉价、更可控的操作替代线程阻塞的方法 &
- 1. broker 清理文件介绍本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
- 本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能。分享给大家供大家参考,具体如下:工具类...public
- Java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于
- 发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客。本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有
- springboot 无法自动装配@Autowired 报错:无法自动装配基本上是因为1、项目里有类似mybatis @Mapper这种第三
- 目录首先看效果图:使用方法:1、普通场景使用2、在DataBinding中使用首先看效果图:整词高亮:分词高亮:下面贴上我封的方法 /**
- 1、Alt+*(按钮快捷键)按钮快捷键也为最常用快捷键,其设置也故为简单。在大家给button、label、menuStrip等其他控件的T
- 前言:因为项目中显示图片是用Picasso,设置placeholder和error图片的时候发现,本地图片的大小无法满足我的需求,需要先对图
- 前言dataGridView是常用的表格控件,实现分页的方式也有很多种,例如直接使用sql语言,配合存储方式,直接读取某一页的内容,大家如果