文件下载是从服务器下载(复制)到浏览器,文件上传由浏览器复制到服务器中都涉及到io流。
文件下载(服务器)
ResponseEntity:可以作为控制器方法的返回值,表示响应到浏览器的完整的响应报文
html
<a th:href="@{/test/down}">下载</a>
controller
// ResponseEntity<byte[]>泛型:响应到浏览器数据的类型
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("img");
// 手动拼接
realPath =realPath+File.separator + "AHGG8760.JPG";
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组
byte[] bytes = new byte[is.available()]; //is.available:获取输入流对应的文件所有的字节数
//将流读到字节数组中
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置要下载方式以及下载文件的名字 键:值(attachment:以附件的形式下载 filename:下载下来默认的名字)
headers.add("Content-Disposition", "attachment;filename=1.JPG");
//设置响应状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象 bytes:响应体 headers:响应头 statusCode:响应状态码
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
//关闭输入流
is.close();
return responseEntity;
}
文件上传
文件上传要求form表单的请求方式必须为post,
并且添加属性enctype="multipart/form-data"。
SpringMVC中将上传的文件封装到MultipartFile对象中,
通过此对象可以获取文件相关信息。
上传步骤:
添加依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
在SpringMVC的配置文件中添加配置:
<!-- 文件上传解析器 要加上id,因为springmvc是通过id获取的 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
html
<form th:action="@{/test/up}" method="post" enctype="multipart/form-data">
头像<input type="file" name="photo"><br>
<input type="submit" value="上传">
</form>
controller
在控制器方法中获得上传的文件,通过输入流读取,通过输出流输出到指定位置。
MultipartFile: 封装上传文件的对象,直接不需要读写, 对象名称要和页面的name值一致。
//没有具体的文件服务器,所以先上传tomcat服务器中,所以要获取当前工程中的路径:target下面工程的路径
@RequestMapping( "/test/up")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
String filename = photo.getOriginalFilename(); //获取上传的文件的文件名
// 获取ServletContext对象
ServletContext servletContext = session.getServletContext();
// 获取当前工程下photo目录的真实路径
String photPath = servletContext.getRealPath("photo");
// 创建photoPath所对应的File对象
File file=new File(photPath);
// 判断file所对应目录是否存在
if (!file.exists()){
file.mkdir(); //不存在直接把目录创建出来
}
// 路径(photo) + / + 文件名称
String finalPath=photPath+File.separator+filename;
// 上传文件
photo.transferTo(new File(finalPath));
return "success";
}
解决上传过程中文件重名问题
使用字符串截取后缀名,然后通过UUID的方式把文件名称随机修改。
@RequestMapping( "/test/up")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
String filename = photo.getOriginalFilename(); //获取上传的文件的文件名
// 获取上传的文件的后缀名
String hzName = filename.substring(filename.lastIndexOf("."));
// 获取uuid
String uuid = UUID.randomUUID().toString();
// 拼接一个新的文件名
filename=uuid+hzName;
ServletContext servletContext = session.getServletContext();
String photPath = servletContext.getRealPath("photo");
File file=new File(photPath);
if (!file.exists()){
file.mkdir();
}
String finalPath=photPath+File.separator+filename;
photo.transferTo(new File(finalPath));
return "success";
}