@PostMapping("/upload")
public R<String> upload(MultipartFile file) {
String originalFilename = file.getOriginalFilename();//xxxx.jpg
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString()+suffix;
File dir = new File(basePath);
if (!dir.exists()){
dir.mkdirs();
}
log.info("接收到图片:{}",file);
try {
file.transferTo(new File(basePath+fileName));
}catch (IOException ex){
ex.printStackTrace();
}
return R.success(fileName);
}
这段代码来自瑞吉外卖的文件上传方法
相关代码解析如下:
1.
@PostMapping("/upload")
这是一个spring mvc 的一个注解,表示该方法用于 HTTP POST 请求,其 URL 路径为 /upload
2.
? ? public R<String> upload(MultipartFile file) {
这行代码定义了一个名为 upload 的代码,它接受一个类型为 MultipartFile 的参数,该参数代表上传的文件,返回值是? R<String > 类型,其中R 是一个自定义响应类,用于封装响应数据。
package com.nit.reggie.common;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 通用返回结果,服务端响应的数据最终都会封装成此对象
* @param <T>
*/
@Data
public class R<T> implements Serializable {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
3.
String originalFilename = file.getOriginalFilename();
从上传的文件对象中,获取原始文件名。
4.
?String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
截取原始文件名的后缀部分,例如从"example.jpg"中获取".jpg"
5.
String fileName = UUID.randomUUID().toString()+suffix;
使用 UUID 生成一个新的文件名,并拼接上原始文件的后缀。这样做的目的是确保了即使有相同的文件名上传,也不会发生覆盖。
6.
? ? ? ? File dir = new File(basePath);
创建一个File 对象,代表要存储上传的文件目录。
7.?
? ? ? ? if (!dir.exists()){
如果目录不存在
8.
? ? ? ? ? ? dir.mkdirs();
? ? ? ? }
创建目录
9.???
? ?log.info("接收到图片:{}",file);
使用日志记录工具记录1条信息,表示接收到了一个文件
10.
? ? ? ? try {
? ? ? ? ? ? file.transferTo(new File(basePath+fileName));
? ? ? ? }catch (IOException ex){
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? }
尝试将上传的文件转移到指定的目录,(该目录有base Path和新生成的fileName 组成)
如果出现任何 IOException 异常,则捕获该异常并打印堆栈跟踪。
11.
? ? ? ? return R.success(fileName);
? ? }
?返回一个成功的响应,其中包含新生成的文件名。
总结: 这段代码的功能是,接收一个上传的文件,为其生成一个新的并且唯一的文件名,并将其保存到指定的目录,并返回新的文件名。