SpringBoot 文件上传到指定文件夹
第一种
1、在application.yml文件中设置存储文件夹地址
upload:
path: E:\upload\
2、配置映射路径
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//其中image表示访问的前缀。"file:E:/upload/"是文件真实的存储路径
registry.addResourceHandler("/upload/**").addResourceLocations("file:E:/upload/");
}
}
3、上传文件
上传文件类
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${upload.path}")
private String filePath;
//根据日期生成路径 2022/1/15/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/");
/**
* 上传文件
*/
@PostMapping("/upload")
public R<String> uploadFile(@RequestBody MultipartFile file) {
if (file == null) return R.error("文件不能为空");
//1、获取上传文件的名字
String originalFilename = file.getOriginalFilename();
//2、对原始文件名进行判断
if (!originalFilename.endsWith(".jpg") && !originalFilename.endsWith(".png")) {
return R.error("上传文件类型错误,请上传png或jpg类型的图片");
}
//3、使用工具类,防止重复 返回:af66cdc12867443787362575b92ca514.jpg
String fileName = PathUtils.generateFilePath(originalFilename);
//4、创建存储日期的文件夹
String datePath = sdf.format(new Date());
//5、创建目录
File dir = new File(filePath + datePath, fileName);
//6、如果不存在就创建该文件夹
if (!dir.exists()) {
dir.mkdirs();
}
try {
//7、将文件转存到指定文件夹
file.transferTo(dir);
} catch (Exception e) {
return R.error(e.getMessage());
}
return R.success(datePath + fileName);
}
}
PathUtils类
public class PathUtils {
public static String generateFilePath(String fileName){
//uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致,获取文件.jpg
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
return new StringBuilder().append(uuid).append(fileType).toString();
}
}
结果返回类R
@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;
}
}
时间:2023-05-15 中午
第二种
1、在application.yml文件中设置存储文件夹地址
server:
port: 9092
ip: localhost #主机ip
2、上传文件
Controller
@Api(tags = "文件上传接口")
@RestController
@RequestMapping("/api/admin/file")
public class AdminUpdateController {
@Autowired
private UploadService uploadService;
/**
* @param file 文件
* @return String
*/
@PostMapping("/upload")
@ApiOperation(value = "文件上传")
public Result<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
return uploadService.uploadFile(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 下载文件
*
* @param fileDate 文件夹日期
* @param fileName 文件名称
* @param response 响应流
*/
@GetMapping("/download/{fileDate}/{fileName}")
public void downloadFile(@PathVariable String fileDate,@PathVariable String fileName,
HttpServletResponse response) {
uploadService.downloadFile(fileDate,fileName, response);
}
}
Service
public interface UploadService {
/**文件上传*/
Result<String> uploadFile(MultipartFile file) throws IOException;
/**下载文件*/
void downloadFile(String fileDate,String fileName, HttpServletResponse response);
}
ServiceImpl
@Slf4j
@Service
public class UploadServiceImpl implements UploadService {
/**
* 主机ip,localhost默认值
*/
@Value("${ip:localhost}")
private String ip;
/**
* 主机端口
*/
@Value("${server.port}")
private String port;
/**
* ROOT_PATH文件表示在本地存储路径,File.separator代表分隔符
* 列如:D:\javaXM\2024_Spring_Study\BS\files
*/
private static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";
/**
* 文件上传
*
* @param file 文件
*/
@Override
public Result<String> uploadFile(MultipartFile file) {
if (file == null) {
return Result.failure(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
}
// 1、获取上传文件的名字
String originalFilename = file.getOriginalFilename();
// 2、判断文件名是否为空
if (StrUtil.isEmpty(originalFilename)){
return Result.failure(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
}
// 3、对原始文件名进行判断
if (!originalFilename.endsWith(".jpg") && !originalFilename.endsWith(".png")) {
return Result.failure(HttpCodeEnum.FILE_TYPE_ERROR_NEW);
}
// 4、使用工具类,防止重复 返回:af66cdc12867443787362575b92ca514.jpg
String fileName = PathUtils.generateFilePath(originalFilename);;
// 5、创建存储日期的文件夹 根据日期生成路径 yyyy-MM-dd/
Date date = DateUtil.date(System.currentTimeMillis());
String datePath = DateUtil.format(date, "yyyy-MM-dd/");
// 6、判断文件夹是否存在
if (!FileUtil.exist(ROOT_PATH+File.separator+datePath)) {
// 如果当前文件的父级目录不存在,就创建
FileUtil.mkdir(ROOT_PATH+File.separator+datePath);
}
// 7、创建目录
File saveFile = new File(ROOT_PATH +File.separator+ datePath, fileName);
// 8、存储文件到本地的磁盘里面去
try {
file.transferTo(saveFile);
} catch (IOException e) {
log.error(SystemConstants.ERROR_LOG, e.getMessage());
throw new ServiceException(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
}
// 9、返回的文件链接
String url = "http://" + ip + ":" + port + "/api/admin/file/download/" + datePath + fileName;
return Result.success(url);
}
/**
* 下载文件
*/
@Override
public void downloadFile(String fileDate, String fileName, HttpServletResponse response) {
String filePath = ROOT_PATH + File.separator + fileDate+File.separator + fileName;
// 判断下载的文件是否存在
if (!FileUtil.exist(filePath)) {
throw new ServiceException(HttpCodeEnum.FILE_DISAPPEAR_ERROR_NEW);
}
byte[] bytes = FileUtil.readBytes(filePath);
ServletOutputStream outputStream = null;
// 数组是一个字节数组,也就是文件的字节流数组
try {
outputStream = response.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
throw new ServiceException(HttpCodeEnum.FILE_DOWNLOAD_ERROR_NEW);
}
}
}
PathUtils类
public class PathUtils {
public static String generateFilePath(String fileName){
//uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致,获取文件.jpg
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
return new StringBuilder().append(uuid).append(fileType).toString();
}
}
结果返回类R
/**
* 统一结果返回类
*
* @param <T>
*/
@Data
public class Result<T> implements Serializable {
private static final long serialVersionUID = -3373652430525625264L;
private Integer code;
private String msg;
private T data;
/**
* 成功时返回数据
*
* @param object 参数
* @param <T> 类型
* @return 返回
*/
public static <T> Result<T> success(T object) {
Result<T> r = new Result<T>();
r.data = object;
r.code = HttpCodeEnum.SUCCESS.getCode();
r.msg = HttpCodeEnum.SUCCESS.getMsg();
return r;
}
/**
* 失败时返回信息
*
* @param httpCodeEnum 参数
* @param <T> 类型
* @return 返回
*/
public static <T> Result<T> failure(HttpCodeEnum httpCodeEnum) {
Result<T> r = new Result<T>();
r.data = null;
r.msg = httpCodeEnum.getMsg();
r.code = httpCodeEnum.getCode();
return r;
}
public static <T> Result<T> error(String msg, Integer code) {
Result<T> r = new Result<T>();
r.data = null;
r.msg = msg;
r.code = code;
return r;
}
}
枚举类
@Getter
public enum HttpCodeEnum {
SUCCESS(200, "请求成功"),
FILE_UPLOAD_ERROR_NEW(208, "文件上传失败"),
FILE_DISAPPEAR_ERROR_NEW(209, "文件不存在"),
FILE_DOWNLOAD_ERROR_NEW(210, "文件下载失败"),
ADMIN_ERROR_NEW(211, "保存失败"),
FILE_TYPE_ERROR_NEW(212, "上传文件类型错误,请上传png或jpg类型的图片")
;
private final Integer code;
private final String msg;
HttpCodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
时间:2024-02-27 晚上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】