【Javaweb】【瑞吉外卖】上传下载实现
上传文件
原理:前端让用户选择一个文件,点击丢给后端上传,后端servlet接收到这些请求就进行应答构建连接,完了就开始接收。
但实现这些原理可以不是很懂。servlet封装了一下,spring boot也封装了一下。实现就比较简单。
实现过程:
- 确定下载的目标路径
- 转存就好了
/**
* 输入这个类就是spring boot基于servlet进行封装,直接 写这个参数就可以接收
* 但是这个参数名称file要与前端传入一致,否则应该要写别的注解
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
log.info(file.toString());
// 看一下输入的basePath是否建了目录
// 否则不会自己建目录会报错
File dir = new File(basePath);
if (!dir.exists()){
dir.mkdir();
}
String originPathName = file.getOriginalFilename();
// 由于如果按照源文件名字保存,可能会重名,所以使用UUID进行编码然后保存
// 拼接一下拓展名,就好了
String suffix = originPathName.substring(originPathName.lastIndexOf("."));
String prefix = UUID.randomUUID().toString();
String fileName = prefix + suffix;
try {
// 最后调用transfer就可以转存了
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
下载文件
下载文件稍稍会复杂一些些,但其实也还好,就是用文件IO流就好了。
保存好的文件是保存在了服务端刚刚设置的文件夹下,拿着时候相对于服务端程序就是需要input一下,将upload的文件读入程序,然后再去找一个output输出就好了。
实现过程:
- 开启文件IO流将保存的文件读入程序。
- 从HTTP Response里面获得输出流,往里面写就好了。
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
FileInputStream fis = null;
ServletOutputStream sos = null;
try {
fis = new FileInputStream(new File(basePath + name));
sos = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes) ) != -1){
sos.write(bytes);
}
sos.flush();
} catch (Exception e) {
// e.printStackTrace();
} finally {
try {
fis.close();
sos.close();
} catch (Exception e) {
// e.printStackTrace();
}
}
}