找不到指定路径,原因是上传的文件是放在 "/static/files" 目录下的,本地可以;
而项目打包为jar包后,无法对jar包内进行操作,"/static/files"目录失效;
解决办法 是将上传的图片存放在jar包外面,动态的创建一个 "/img" 文件夹来存放文件.
源代码,注释的为本地的操作
解决过程:可用sout打印出变量的值,来判断是否是想要的地址
/**
* 上传文件信息,文件信息保存到数据库,文件数据保存在\target\img目录下
* @param myFile 上传的文件
* @param session
* @return 完成后重定向到展示页面
* @throws IOException
*/
@RequestMapping("upload")
public String upload(MultipartFile myFile, HttpSession session) throws IOException {
//获取用户id
User user = (User) session.getAttribute("user");
Integer id=user.getId();
//获取文件的原始名称
String oldFileName = myFile.getOriginalFilename();
//先获取原来的后缀
String ext = "."+ FilenameUtils.getExtension(oldFileName);
//生成新的文件名(时间戳+UUID+后缀)
String newFileName=new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+ UUID.randomUUID().toString().replace("-","")+ ext;
//法1、动态获取当前项目files目录 (realPath绝对路径) 本地可用,部署报错
// String realPath= ResourceUtils.getURL("classpath:").getPath()+"/static/files";
//法2、部署后,文件上传到服务器,在jar包外生成一个img文件夹,用来存放文件
String realPath = System.getProperty("user.dir") + "/img/";
System.out.println("绝对路径*******"+realPath);
//根据日期生成目录
String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//绝对路径 + 时间戳
String dateDirPath = realPath + "/" + dateFormat ;
File dateDir = new File(dateDirPath);
//如果文件夹不存在,创建
if (!dateDir.exists()) {
dateDir.mkdirs();
}
//处理文件上传(将文件数据放入新建的文件夹中)
myFile.transferTo(new File(dateDir,newFileName));
//将文件信息放入数据库
UserFile userFile = new UserFile();
userFile.setOldFileName(oldFileName).setNewFileName(newFileName).setExt(ext);
// userFile.setPath("/files/"+dateFormat);
userFile.setPath("/img/"+dateFormat);
userFile.setUId(id);
userFile.setUploadTime(new Date());
userFileService.saveFile(userFile);
return "redirect:/file/showAll";
}
@RequestMapping("deleteFile")
public String deleteFile(Integer id) throws FileNotFoundException {
//根据id查询信息
UserFile userFile = userFileService.findByFileId(id);
//删除文件本身
String realPath=System.getProperty("user.dir") + userFile.getPath();
// String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
File file = new File(realPath, userFile.getNewFileName());
if (file.exists()) file.delete();//立即删除
//接着删除数据库中记录
userFileService.deleteFileById(id);
return "redirect:/file/showAll";
}
/**
* 文件下载(一个请求只能对应一个唯一的响应,无返回值)
*/
@GetMapping("download")
public void download(String openStyle,Integer id, HttpServletResponse response){
//获取打开方式(判断是下载还是打开)
openStyle = openStyle == null ? "attachment" : openStyle;
FileInputStream is=null;
ServletOutputStream os=null;
try {
//获取文件信息
UserFile userFile = userFileService.findByFileId(id);
//根据文件信息中文件名字 和 文件存储路径获取文件输入流(realPath文件下载路径) 部署后报错
// String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
// String realPath=System.getProperty("user.dir")+"/static" + userFile.getPath();
// String realPath = System.getProperty("user.dir") + "/img/" + userFile.getPath();
String realPath=System.getProperty("user.dir") + userFile.getPath();
System.out.println("realPath********"+realPath);
//获取文件输入流
is = new FileInputStream(new File(realPath, userFile.getNewFileName()));
//附件下载会默认打开,拿流之前设置响应头(attachment下载,inline在线打开)
String OldNameEncode = URLEncoder.encode(userFile.getOldFileName(), "UTF-8");
response.setHeader("content-disposition",openStyle+";fileName="+OldNameEncode);
//获取响应输出流
os = response.getOutputStream();
//文件拷贝
IOUtils.copy(is, os);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
is.close();
os.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}