本人是小白一枚,前段时间弄了一个发布活动的功能,本地测试的时候没什么问题。但当我打包成jar包 部署到服务器之后,就发现问题了。我重启服务或者时间过了几天之后,发布活动中的图片突然就报错了,显示地址错误。一脸蒙蔽的我。
后来也是各种百度,才知道发生了什么。
原因:把项目部署到服务器上之后,文件上传默认会在/tmp路径中。而且 linux对’/tmp’下文件会自动清理。
那我们可以更改下存贮文件的地址
创建一个配置类:
public class WebMvcConfiguration implements WebMvcConfigurer {
@Value("${out.resource.path}")
private String path;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(new String[]{"/imgUrl/**"}).addResourceLocations( "file:" + path + "/");
}
}
在配置文件中添加:我的文件是:application.properties,有的朋友可能是application.yml,下面配置文件中限制文件的大小看情况添加吧,因为我控制器层中有判断文件大小
#图片上传路径
out.resource.path=D:\\upload
#out.resource.path=file:D://upload/
#限制上传文件的大小
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.max-file-size=10MB
控制器类:
/**
* 上传文件夹的名称
*/
@Value("${out.resource.path}")
private String path;
private static final String UPLOAD_DIR_NAME = "imgUrl";
/**
* 上传文件的最大大小
*/
private static final long FILE_MAX_SIZE = 5 * 1024 * 1024;
/**
* 允许上传的文件类型
*/
private static final List<String> FILE_CONTENT_TYPES = new ArrayList<>();
/**
* 初始化允许上传的文件类型的集合
*/
static {
FILE_CONTENT_TYPES.add("image/jpeg");
FILE_CONTENT_TYPES.add("image/png");
}
@RequestMapping("/insertImg")
public ResponseResult<String> handleUpload(HttpSession session, @RequestParam("file") MultipartFile file) {
// 检查是否存在上传文件 > file.isEmpty()
if (file.isEmpty()) {
// 抛出异常:文件不允许为空
throw new FileEmptyException("上传失败!没有选择上传的文件,或选中的文件为空");
}
// 检查文件大小 >file.getSize()
if (file.getSize() > FILE_MAX_SIZE) {
// 抛出异常:文件大小超出限制
throw new FileSizeOutOfLimitException("您上传文件的大小超过了:"+FILE_MAX_SIZE);
}
// 检查文件类型 > file.getContentType()
if (!FILE_CONTENT_TYPES.contains(file.getContentType())) {
// 抛出异常:文件类型限制
throw new FileTypeNotSupportException("您上传的图片格式不对,只能上传以下格式:"+FILE_CONTENT_TYPES);
}
// 确定上传文件夹的路径
// session.getServletContext.getRealPath (UPLOAD_DIR_NAME)
// > exists() > mkdirs()
//String parentPath = session.getServletContext().getRealPath(UPLOAD_DIR_NAME);
String parentPath = path ;
File parent = new File(parentPath);
if (!parent.exists()) {
parent.mkdirs();
}
// 确定文件名 > getOriginalFileName()
String originalFileName = file.getOriginalFilename();
int beginIndex = originalFileName.lastIndexOf(".");
String suffox = originalFileName.substring(beginIndex);
String fileName = System.currentTimeMillis() + "" + (new Random().nextInt(900000) + 100000) + suffox;
// 确定文件
File dest = new File(parent, fileName);
// 执行保存文件
try {
file.transferTo(dest);
System.err.println("上传成功");
} catch (IllegalStateException e) {
// 抛出异常:上传失败!
} catch (IOException e) {
// 抛出异常:上传失败!
}
// 获取当前用户的id
Integer uid = getUidFromSession(session);
// 更新头像数据
String avatar = "/" + UPLOAD_DIR_NAME + "/" + fileName;// 本地运行使用这个
// iArticleService.addImgUrl(avatar);
// 返回头像
ResponseResult<String> rr = new ResponseResult<>();
rr.setState(SUCCESS);
rr.setData("/" + UPLOAD_DIR_NAME + "/" + fileName);
return rr;
}
目前为止我是这么解决的,不晓得对不对,哈哈 有更好的方法的朋友们可以建议下