本人是小白一枚,前段時間弄了一個釋出活動的功能,本地測試的時候沒什麼問題。但當我打包成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;
}
目前為止我是這麼解決的,不曉得對不對,哈哈 有更好的方法的朋友們可以建議下