当前位置:   article > 正文

本地上传和下载文件正常,部署后报错java.io.IOException: java.io.FileNotFoundException_java resourceutils.geturl 报错

java resourceutils.geturl 报错

找不到指定路径,原因是上传的文件是放在 "/static/files" 目录下的,本地可以;

而项目打包为jar包后,无法对jar包内进行操作,"/static/files"目录失效;

解决办法 是将上传的图片存放在jar包外面,动态的创建一个 "/img" 文件夹来存放文件.

源代码,注释的为本地的操作

 解决过程:可用sout打印出变量的值,来判断是否是想要的地址

  1. /**
  2. * 上传文件信息,文件信息保存到数据库,文件数据保存在\target\img目录下
  3. * @param myFile 上传的文件
  4. * @param session
  5. * @return 完成后重定向到展示页面
  6. * @throws IOException
  7. */
  8. @RequestMapping("upload")
  9. public String upload(MultipartFile myFile, HttpSession session) throws IOException {
  10. //获取用户id
  11. User user = (User) session.getAttribute("user");
  12. Integer id=user.getId();
  13. //获取文件的原始名称
  14. String oldFileName = myFile.getOriginalFilename();
  15. //先获取原来的后缀
  16. String ext = "."+ FilenameUtils.getExtension(oldFileName);
  17. //生成新的文件名(时间戳+UUID+后缀)
  18. String newFileName=new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+ UUID.randomUUID().toString().replace("-","")+ ext;
  19. //法1、动态获取当前项目files目录 (realPath绝对路径) 本地可用,部署报错
  20. // String realPath= ResourceUtils.getURL("classpath:").getPath()+"/static/files";
  21. //法2、部署后,文件上传到服务器,在jar包外生成一个img文件夹,用来存放文件
  22. String realPath = System.getProperty("user.dir") + "/img/";
  23. System.out.println("绝对路径*******"+realPath);
  24. //根据日期生成目录
  25. String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  26. //绝对路径 + 时间戳
  27. String dateDirPath = realPath + "/" + dateFormat ;
  28. File dateDir = new File(dateDirPath);
  29. //如果文件夹不存在,创建
  30. if (!dateDir.exists()) {
  31. dateDir.mkdirs();
  32. }
  33. //处理文件上传(将文件数据放入新建的文件夹中)
  34. myFile.transferTo(new File(dateDir,newFileName));
  35. //将文件信息放入数据库
  36. UserFile userFile = new UserFile();
  37. userFile.setOldFileName(oldFileName).setNewFileName(newFileName).setExt(ext);
  38. // userFile.setPath("/files/"+dateFormat);
  39. userFile.setPath("/img/"+dateFormat);
  40. userFile.setUId(id);
  41. userFile.setUploadTime(new Date());
  42. userFileService.saveFile(userFile);
  43. return "redirect:/file/showAll";
  44. }
  45. @RequestMapping("deleteFile")
  46. public String deleteFile(Integer id) throws FileNotFoundException {
  47. //根据id查询信息
  48. UserFile userFile = userFileService.findByFileId(id);
  49. //删除文件本身
  50. String realPath=System.getProperty("user.dir") + userFile.getPath();
  51. // String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
  52. File file = new File(realPath, userFile.getNewFileName());
  53. if (file.exists()) file.delete();//立即删除
  54. //接着删除数据库中记录
  55. userFileService.deleteFileById(id);
  56. return "redirect:/file/showAll";
  57. }
  58. /**
  59. * 文件下载(一个请求只能对应一个唯一的响应,无返回值)
  60. */
  61. @GetMapping("download")
  62. public void download(String openStyle,Integer id, HttpServletResponse response){
  63. //获取打开方式(判断是下载还是打开)
  64. openStyle = openStyle == null ? "attachment" : openStyle;
  65. FileInputStream is=null;
  66. ServletOutputStream os=null;
  67. try {
  68. //获取文件信息
  69. UserFile userFile = userFileService.findByFileId(id);
  70. //根据文件信息中文件名字 和 文件存储路径获取文件输入流(realPath文件下载路径) 部署后报错
  71. // String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
  72. // String realPath=System.getProperty("user.dir")+"/static" + userFile.getPath();
  73. // String realPath = System.getProperty("user.dir") + "/img/" + userFile.getPath();
  74. String realPath=System.getProperty("user.dir") + userFile.getPath();
  75. System.out.println("realPath********"+realPath);
  76. //获取文件输入流
  77. is = new FileInputStream(new File(realPath, userFile.getNewFileName()));
  78. //附件下载会默认打开,拿流之前设置响应头(attachment下载,inline在线打开)
  79. String OldNameEncode = URLEncoder.encode(userFile.getOldFileName(), "UTF-8");
  80. response.setHeader("content-disposition",openStyle+";fileName="+OldNameEncode);
  81. //获取响应输出流
  82. os = response.getOutputStream();
  83. //文件拷贝
  84. IOUtils.copy(is, os);
  85. }catch (Exception e){
  86. e.printStackTrace();
  87. }finally {
  88. try {
  89. is.close();
  90. os.close();
  91. } catch (IOException e) {
  92. throw new RuntimeException(e);
  93. }
  94. }
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/892050
推荐阅读
相关标签
  

闽ICP备14008679号