一、文件上传介绍
1、文件上传
文件上传,也成为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以让其它用户浏览和下载文件。在实际项目开发中文件上传是常用的,例如发微博、发朋友圈等都用到文件上传功能。
2、文件上传的前端页面介绍
文件上传时,对于前端页面的form表单如下要求
- method="post" 采用post方式提交数据
- enctype="multipart/form-data" 采用multipart格式上传文件
- type="file" 使用input的file控件上传
好消息的是现在有很多前端组件库也提供了相应的上传组件,但是底层原理还是基于from表单的文件上传。
3、文件上传的服务器代码介绍
服务器要接收客户端页面上传的文件,通常都会使用Apache的两个组件
- commons-fileupload
- commons-io
好消息的是在spring框架spring-web包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在controller中方法中声明一个MultipartFile类型的参数即可接收上传的文件。如
@PostMapping("/XXX") public String upload(MultipartFile myFile) { return null; }
4、下面都是以上传图片为例子
第一步:新建upload.html
<form method="post" action="/common/upload" enctype="multipart/form-data"> <input name="myFile" type="file"/> <input type="submit" value="提交"/> </form>
注:表单中的method必须是post;enctype属性值必须是multipart/form-data;要确保某一个input标签中的type属性值是file
第二步:编写CommonController类
package com.hq.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
@RequestMapping("/common")
public class CommonTroller {
@PostMapping("/upload")
public String upload(MultipartFile myFile) throws IOException {
myFile.transferTo(new File("D://hello.jpg"));
return "sucess";
}
}
参数myFile不是随便写的,要与<input name="myFile" type="file"/>中的name值相同
3、测试
在提交后:D盘下多了hello.jpg
5、完善上述例子
** 上面的例子,将图片保存在D://hello.jpg这种写法是固定了图片保存位置了,在实际开发中很少使用这种方式,在实际开发中常用动态的保存方式**
第一步:在application.yml(我将后缀.properties改成.yml)设值路径
upload: path: D:\img\
第二步:完善上面的CommonController类
package com.hq.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@RestController
@RequestMapping("/common")
public class CommonTroller {
@Value("${upload.path}")
String basePath;
@PostMapping("/upload")
public String upload(MultipartFile myFile) throws IOException {
//此时的myFile是一个临时文件,需要转到指定的位置,不然本次请求完成后临时文件会被删除
//原始文件名(不使用原始的文件名防止文件覆盖)
String originalFilename = myFile.getOriginalFilename();
//获取文件名的后缀,如获取.jpg后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名重复造成图片覆盖
String fileName = UUID.randomUUID().toString() + suffix;
//如果目录是多级的,那么需要创建目录
//创建一个目录对象
File dir = new File(basePath);
//判断当前目录是否存在,如果不存在那么创建该目录
if(!dir.exists()){
dir.mkdir();
}
myFile.transferTo(new File(basePath + fileName));
return "sucess";
}
}
第三:测试
二、文件下载
1、文件下载介绍
文件下载,也成为download,是指将文件从服务器传输到本地计算机的过程。
通过浏览器进行文件下载,通常有两种表现形式:
- 以附件形式下载,弹出保存对话框,将文件保存到指定磁盘目录
- 直接在浏览器中打开(下面的例子)
通过浏览器进行文件下载,本质上就是服务器将文件以流的形式写回浏览器的过程
2、前端页面介绍
文件下载,页面端可以使用标签展示下载的图片
3、以下载图片为例
思路:页面发送请求--->服务器通过输出流将图片回显到浏览器上
这个例子的请求地址:/common/download?name=${response.data}
package com.hq.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
@RestController
@RequestMapping("/common")
public class CommonTroller {
@Value("${upload.path}")
String basePath;
@PostMapping("/download")
public void downLoad(String name, HttpServletResponse response){
try {
//输入流,通过输入流将读取文件内容
FileInputStream fileInputStream = new FileInputStream(basePath+name);
//输出流,通过输出流将文件回写到浏览器,在浏览器展示图片
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
while(fileInputStream.read(bytes) != -1){
outputStream.write(bytes,0,len);
}
//关闭流
fileInputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注:这里的前端页面我不太懂,就没有成功的在浏览器上回显图片,但是服务器端代码流程就是上述
版权归原作者 hyt_struggle 所有, 如有侵权,请联系我们删除。