需求:再web项目中,可能会出现需要上传文件,如用户注册上传头像,上传照片,或其他资源等
springmvc实现文件上传:
1.导入jar包:
2设置表单:
<!--当表单中存在文件上传时,需要再form表单中添加enctype=\"multipart/form-data\"属性,而且提交方式必须为post请求,不然上传图片等会报错-->
<form action=\"../file\" method=\"post\" enctype=\"multipart/form-data\">
<input type=\"file\" name=\"img\">
<input type=\"submit\">
</form>
3.设置文件上传视图解析器:
<!--配置文件上传视图解析器-->
<bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">
<!--设置编码格式-->
<property name=\"defaultEncoding\" value=\"utf-8\"/>
<!--设置文件最大的大小10M-->
<property name=\"maxInMemorySize\" value=\"#{10*1024*1024}\"/>
</bean>
4.上传功能后台:
@Controller
public class FileController {
/*@RequestParam(\"img) 将前端请求中指定name的数据放入参数中*/
@RequestMapping(\"/file\")
public String file(@RequestParam(\"img\") MultipartFile file, HttpServletRequest request) {
// 获取原始文件名
String trueName = file.getOriginalFilename();
// 设置文件保存的路径:当前项目的下的/static/upload/文件夹下;因为运行时是编译后的文件再tomcat服务器中运行,
// 因此查看是否上传成功需要再class文件中查看
String path = request.getSession().getServletContext().getRealPath(\"/static/upload/\");
// 设置上传文件保存本地的文件名及路径
File file1 = new File(path + trueName);
// 判断当前文件父级文件夹是否存在,如果不存在,就创建文件夹
if (!file1.getParentFile().exists()) {
file1.mkdirs();
}
try {
// 上传文件,核心功能
file.transferTo(file1);
} catch (IOException e) {
e.printStackTrace();
}
return \"index\";
}
}
一个最简单的上传功能就完成了,不过这种方式并不好,因为如果有多人操作,出现上传文件名相同等问题,会覆盖,因此要生成一个不会重复的文件名:
1.使用时间来设置文件名:
上传后保存路径:
2.使用UUID类:
其他的内容都一样,生成文件名如下:
文件的下载:
1.可以直接前端设置a标签连接文件地址:
右击链接另存就可以下载了;
2.写一个后台控制器:
package com.zs.controller;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
@Controller
public class DownLoadController {
@RequestMapping(\"/down\")
public ResponseEntity<byte[]> download(@RequestParam(\"filename\") String filename, HttpServletRequest request) throws IOException {
String path = request.getSession().getServletContext().getRealPath(\"/static/upload/\");
File file = new File(path + filename);
String encodedFileName = null;
// 获取User-Agent,借此判断是哪儿种类型的浏览器
String header = request.getHeader(\"User-Agent\");
if (header.indexOf(\"Chrome\") > 0)
encodedFileName = URLEncoder.encode(filename, \"utf-8\").replaceAll(\"+\", \"%20\");
else
encodedFileName = MimeUtility.encodeWord(filename);
byte[] bytes = FileUtils.readFileToByteArray(file);
HttpHeaders headers = new HttpHeaders();
//设置响应的文档类型:二进制形式
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//弹出下载窗口,并制定文件名
headers.setContentDispositionFormData(\"attachment\", encodedFileName);
//状态码
HttpStatus httpStatus = HttpStatus.CREATED;
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, httpStatus);
return responseEntity;
}
}
前端页面传要下载的图片名: