一、上传文件
而在 Java 中,一个接口只支持一种 content-type,
- json 就用 @RequestBody,
- form 表单就用 @RequestParam 或不写,
- form-data 就用 MultipartFile。 ```java package com.tj.reggie.controller.file;
import com.tj.reggie.controller.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; 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 javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.UUID;
/**
文件上传和下载 / @RestController @RequestMapping(“/common”) @Slf4j public class FileController { /*
- 上传 *
- @param file 这个名称必须和前端的formData 文件的名称要对应
@return */ @PostMapping(“/upload”) public R
upload(MultipartFile file) throws IOException { //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除 //获取原始文件名 String originalFilename = file.getOriginalFilename(); //获取原始文件名的后缀 String suffix = originalFilename.substring(originalFilename.lastIndexOf(“.”));
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖 String s = UUID.randomUUID().toString() + suffix;
//将文件转存到指定位置“D:/222” String baseDir = “D:/222/“; //创建一个目录对象 File dir = new File(baseDir); //如果目录不存在,则创建目录 if (!dir.exists()) dir.mkdirs();
String fileName = “ceshi.jpg”; file.transferTo(new File(baseDir + fileName)); return R.success(baseDir + fileName); }
/**
- 文件下载 *
@param name */ @GetMapping(“/download”) public void download(String name, HttpServletResponse response) {
//要下载的文件路径 String url = “d:/TJ111/222.jpg”; response.setContentType(“image/jpeg”); //设置响应格式 try (// 把原始的字节输入流包装成高级的缓冲字节输入流
// 输入流,通过输入流读取文件内容InputStream bis = new BufferedInputStream(new FileInputStream(new File(url)));// 把原始的字节输出流包装成高级的缓冲字节输出流//输出流,通过输出流将文件写回浏览器,在浏览器展示图片了OutputStream bos = new BufferedOutputStream(response.getOutputStream());
) { // 定义一个字节数组转移数据
byte[] buffer = new byte[1024];int len;//记录每次读取的字节数while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len); //读多少,输出多少}log.info("文件下载完成");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<a name="ezaSv"></a>## 二、下载文件参考:[Java下载文件的四种方式详细代码](https://www.jb51.net/article/232182.htm)<br />[Java获取文件类型的5种方法](https://baijiahao.baidu.com/s?id=1697974203366117168)```java/*** 文件下载** @param response 响应输出* @param file File文件* @throws IOException*/public static void downloadFile(HttpServletResponse response, File file) throws IOException {//设置响应格式,文件类型ContentTyperesponse.setContentType(Files.probeContentType(file.toPath()));//设置文件名response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());try (// 把原始的字节输入流包装成高级的缓冲字节输入流// 输入流,通过输入流读取文件内容InputStream bis = new BufferedInputStream(new FileInputStream(file));// 把原始的字节输出流包装成高级的缓冲字节输出流//输出流,通过输出流将文件写回浏览器,在浏览器展示图片了OutputStream bos = new BufferedOutputStream(response.getOutputStream());) { // 定义一个字节数组转移数据byte[] buffer = new byte[1024];int len;//记录每次读取的字节数while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len); //读多少,输出多少}log.info("文件下载完成");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
