依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 130|回复: 0

Springboot 实现 上传、下载 以及解决必须项目重启才能访问...

[复制链接] 主动推送

5449

主题

5496

帖子

6837

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6837
发表于 2023-12-27 09:46:04 | 显示全部楼层 |阅读模式
Springboot 实现 上传、下载 以及解决必须项目重启才能访问资源的问题


代码很常见也很简单,后面会讲到一些注意点:
  1. package com.ilas.testboot.fileUpload;


  2. import org.apache.commons.io.FilenameUtils;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.*;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.*;
  10. import java.text.SimpleDateFormat;
  11. import java.util.Date;
  12. import java.util.UUID;

  13. /**
  14. * @Author : JCccc
  15. * @CreateTime : 2020/3/21
  16. * @Description :
  17. **/
  18. @Controller
  19. @RequestMapping("/file")
  20. public class FileController {


  21.     private static final Logger log = LoggerFactory.getLogger(FileController.class);

  22.     //以下三个配置项都可改为 录入在 配置文件 或者是 数据库参数配置表内

  23.     private  static String FILE_PATH = "F:\\testboot\\src\\main\\resources\\static\\upload";

  24.     private  static String IMG_VISIT_PATH ="/upload";

  25.     private  static String IMG_HOST="localhost:8089";
  26.     /**
  27.      * 文件上传
  28.      *
  29.      * @param file
  30.      * @return
  31.      * @throws IOException
  32.      */
  33.     @ResponseBody
  34.     @PostMapping("upload")
  35.     public String upload(@RequestParam("myFile") MultipartFile file) {
  36.         log.info("file name:" + file.getOriginalFilename());
  37.         log.info("file type:" + file.getContentType());
  38.         log.info("file size:" + file.getSize());
  39.         //    设置新的文件名
  40.         String newFileNamePrefix = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "");
  41.         //    获得文件的扩展名
  42.         String extension = FilenameUtils.getExtension(file.getOriginalFilename());
  43.         //    获得新的文件名
  44.         String newFileName = newFileNamePrefix + "." + extension;
  45.         String FILE_PATH = "F:\\testboot\\src\\main\\resources\\static\\upload";
  46.         //  FILE_PATH : 文件的保存路径
  47.         String filePath=FILE_PATH +"/" + newFileName;
  48.         try {

  49.             log.info("开始上传文件【{}】...", newFileName);
  50.             File dest = new File(filePath);
  51.             file.transferTo(dest);
  52.         } catch (IOException e) {
  53.             e.printStackTrace();
  54.             return "error";
  55.         }
  56.         log.info("文件【{}】上传成功...", newFileName);

  57.         return IMG_HOST+IMG_VISIT_PATH+"/"+newFileName;

  58.     }

  59.     /**
  60.      * 文件下载
  61.      * @param fileName
  62.      * @param response
  63.      * @throws IOException
  64.      */
  65.     @GetMapping("download")
  66.     public void download(String fileName, HttpServletResponse response) throws IOException {
  67.        // String fileName = "测试文件上传.txt";
  68.         response.setHeader("content-type", "application/octet-stream");
  69.         response.setContentType("application/octet-stream");
  70.         response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
  71.         byte[] buff = new byte[1024];
  72.         BufferedInputStream bis = null;
  73.         OutputStream os = null;
  74.         try {
  75.             os = response.getOutputStream();
  76.             bis = new BufferedInputStream(new FileInputStream(new File(FILE_PATH+ "/"
  77.                     + fileName)));
  78.             int i = bis.read(buff);
  79.             while (i != -1) {
  80.                 os.write(buff, 0, buff.length);
  81.                 os.flush();
  82.                 i = bis.read(buff);
  83.             }
  84.         } catch (IOException e) {
  85.             e.printStackTrace();
  86.         } finally {
  87.             if (bis != null) {
  88.                 try {
  89.                     bis.close();
  90.                 } catch (IOException e) {
  91.                     e.printStackTrace();
  92.                 }
  93.             }
  94.         }



  95.     }
  96. }
复制代码
需要注意的:
//以下三个配置项都可改为 录入在 配置文件 或者是 数据库参数配置表内

private static String FILE_PATH = "F:\\testboot\\src\\main\\resources\\static\\upload";

private static String IMG_VISIT_PATH ="/upload";

private static String IMG_HOST="localhost:8089";
首先第一个FILE_PATH,在代码里用做是上传的文件保存的路径,对应的是项目结构里:

(可以看到 这是因为在本地,windows环境一个真实的资源路径)

0001.png

0002.png

然后是第二个  IMG_VISIT_PATH ,可以看到配置的是一个 /upload  ,

也就是说访问上传的资源对应的路径,因为我本地传的文件也是传到 /static/upload/ 这个文件夹里面,

而springboot默认的静态资源文件读取路径已经帮我们配置了 classpath:/static/  ,所以我只 配置 /upload 即可(这是方便自定义文件夹 img 或者是headImg 等等)。

这个如果是选择读取的静态资源文件是放在本项目里面的,一定要做好检验,确保是能访问到这个路径下的资源。

检验示例,往这个路径里丢个图片,然后重启项目(为什么要重启一会下面会讲到这个坑):
0003.png


然后在浏览器直接访问这个图片,如果成功,那么静态资源路径读取是没问题的:

0004.png

ps: 如果你这个资源资源访问不了,那么你可以自己配置一下静态资源访问路径,可以参考我这篇,其实该篇文章后面也展示了通过配置类添加设置静态资源访问路径。



第三个 FILE_HOST ,这是静态资源访问的服务器ip地址和端口(域名),因为在本地开的8089端口,所以直接配置成了本地的访问。

ok.按照这个接口我们使用接口调用工具来 测试一下上传接口:

0005.png
可以看到返回了我们拼接之后能直接用于访问图片的地址:
0006.png
但是其实按照目前情况直接访问是 访问不了的:
0007.png
因为服务器对资源文件的保护机制,咱们本地的服务器是不能对外暴露真实的资源路径。

如果没有重启把刚刚上传的资源编译到 target 文件夹里(这是对外暴露的),那么我们就无法访问。

0008.png

这时候就需要我们采取一些解决方案了:

1.我们上传的路径直接改成 传到 target 文件夹里面 。

这样确实能随时上传随时访问,但是这样会引出一个问题,因为target文件夹里面的东西是跟着编译走的,我们本身项目没有保存图片,如果项目clean重新打包,那么这个target里面的图片就会丢失。   不太好。

2.把文件上传路径 设置成专门的文件存储路径 ,然后配置该路径可访问。  可行 (Linux服务器中这么做简单直接)

3.也就是本文介绍的一种配置资源访问路径隐射的方式, 既然服务器没有对外暴露真实的资源路径,那么我们就从这个根源去解决。我们采取对应的资源路径映射。

我们新建 ResourceConfig.java :
  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  3. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

  4. /**
  5. * @Author : JCccc
  6. * @CreateTime : 2020/3/21
  7. * @Description :
  8. **/
  9. @Configuration
  10. public class ResourceConfig implements WebMvcConfigurer {

  11.     public void addResourceHandlers(ResourceHandlerRegistry registry) {

  12.         String path = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\upload\";
  13.         
  14.         
  15.         //配置静态资源访问路径
  16. //        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  17.         
  18.         
  19.         registry.addResourceHandler("/upload/**").addResourceLocations("file:"+path);
  20.     }


  21. }
复制代码
OK,做了这个上传路径的访问真实路径映射后,我们重新启动项目,重新上传图片,直接访问,

0009.png

0010.png

问题解决。剩下的下载接口,也顺便演示一下,其实就是把上传文件返回的路径里面的文件名作为参数调用接口即可:
0011.png

至此,可以正常上传并直接访问了。

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|依星源码资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-4-27 23:49

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表