1 文件上传
1.1 MultipartFile: SpringMVC中对上传文件的封装
public interface MultipartFile extends InputStreamSource {
/*** 获取临时文件名称 */
String getName();
/*** 获取真实(原始)文件名称 */
@Nullable
String getOriginalFilename();
/*** 获取上传文件的MIME类型 */
@Nullable
String getContentType();
/*** 是否是空文件 */
boolean isEmpty();
long getSize();
/*** 获取上传文件的字节数组 */
byte[] getBytes() throws IOException;
/*** 获取上传文件的字节输入流 */
@Override
InputStream getInputStream() throws IOException;
/*** 把上传文件转换成一个Resource对象 */
default Resource getResource() {
return new MultipartFileResource(this);
}
/*** 把临时文件移动到指定位置并重命名,参数是一个文件对象 */
void transferTo(File dest) throws IOException, IllegalStateException;
/*** 把临时文件移动到指定位置并重命名,参数是一个文件路径 */
default void transferTo(Path dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(getInputStream(), Files.newOutputStream(dest));
}
}
1.2 MultipartResolver
它是SpringMVC中文件解析器的标准。 通过一个接口规定了文件解析器中必须包含的方法
public interface MultipartResolver {
/**
判断是否支持文件上传
*/
boolean isMultipart(HttpServletRequest request);
/**
解析HttpServletRequest
*/
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;
/**
删除临时文件和一些清理操作
*/
void cleanupMultipart(MultipartHttpServletRequest request);
}
并且提供了了一个实现:CommonsFileUploadResolver
1.3 实现
- 注入CommonsFileUploadResolver,id必须设置为multipartResolver
@Bean("multipartResolver")
public MultipartResolver multipartResolver(){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
// 设置文件上传大小
commonsMultipartResolver.setMaxUploadSize(5000000);
return commonsMultipartResolver;
}
- controller
@Controller
public class FileUploadController {
@RequestMapping("upload")
public String updateItemById(MultipartFile file) throws Exception {
// 图片上传
// 设置图片名称,不能重复,可以使用uuid
String picName = UUID.randomUUID().toString();
// 获取文件名
String oriName = file.getOriginalFilename();
// 获取图片后缀
String extName = oriName.substring(oriName.lastIndexOf("."));
// 开始上传
file.transferTo(new File("C:/upload/image/" + picName + extName));
return "success";
}
}
2 文件下载
package study.wyy.spring.anno.web;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.UUID;
/**
* @author by wyaoyao
* @Description
* @Date 2021/2/15 8:22 下午
*/
@Controller
public class FileUploadController {
@RequestMapping("/download")
public void getImage(HttpServletRequest request, HttpServletResponse response)throws Exception{
//1.获取ServletContext对象
ServletContext servletContext = request.getServletContext();
//2.获取图片的磁盘绝对路径
String path = servletContext.getRealPath("/images/6.jpg");
//3.获取spring提供的文件系统资源对象
Resource resource = new FileSystemResource(path);
//4.使用spring的工具类把resource中的文件转换成一个字节数组
byte[] images = FileCopyUtils.copyToByteArray(resource.getFile());
//5.使用response设置响应消息头
response.setContentType("application/octet-stream");
//6.输出字节数组
response.getOutputStream().write(images,0,images.length);
}
}