一、上传文件
而在 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 {
//设置响应格式,文件类型ContentType
response.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();
}
}