SpringBoot项目中Resource目录下文件下载及读取的几种方式

一,注意JAVA自动适配Linux与Windows文件路径分隔符

linux文件路径分隔符为 /  ,windows的文件路径分隔符为  \   ,在开发项目过程中不确定用户使用何种操作系统,就需要自动适配路径。

目前已知java提供两种方法获取文件路径分割符:

public static final String FILE_SEPARATOR = File.separator;
//public static final String FILE_SEPARATOR = System.getProperty("file.separator");

二,Resource目录下文件读取

项目中涉及到Excle的导入功能,通常是我们定义完模板供用户下载,用户按照模板填写完后上传;这里待下载模板位置为resource/excelTemplate/test.xlsx,下方尝试了四种读取方式,并且测试了四种读取方式分别的windows开发环境下(IDE中)读取和生产环境(linux下jar包运行读取)。
第一种:本人采取的方式

 

ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx");
InputStream inputStream =classPathResource.getInputStream();
// 获取文件
File file = classPathResource.getFile();
// 获取文件路径
sourceFile = file.getPath();

第二种:

 

InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");

第三种:

 

InputStream inputStream = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");

第四种: Linux生产环境读取失败

 

File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
InputStream inputStream = new FileInputStream(file);

经测试:
前三种方法在开发环境(IDE中)和生产环境(linux部署成jar包)都可以读取到

第四种只有开发环境 时可以读取到,生产环境读取失败。tomcat 解压后文件位置问题

三,下载

在springboot中可以使用ClassPathResource获取文件流的方式方便下载文件

try {
    ClassPathResource classPathResource = new ClassPathResource("sql/SCHEDULE_TASK.sql");
    File file = classPathResource.getFile();
    InputStream inputStream = classPathResource.getInputStream();
      //输出文件
    InputStream fis = new BufferedInputStream(inputStream);
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer);
    fis.close();
    response.reset();

    //获取文件的名字再浏览器下载页面
    String name = file.getName();
    response.addHeader("Content-Disposition", "attachment;filename=" + new String(name.getBytes(), "iso-8859-1"));
    response.addHeader("Content-Length", "" + file.length());
    OutputStream out = new BufferedOutputStream(response.getOutputStream());
    response.setContentType("application/octet-stream");
    out.write(buffer);
    out.flush();
    out.close();
} catch (Exception e) {
    e.printStackTrace();
}
最后就是浏览器访问接口下载文件了

 

这样下载文件就很简单了

 

 

  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Spring Boot进行文件下载时,可以通过以下几种方式控制权限: 1. 文件存储位置权限控制:可以将下载文件存储在指定的文件,并通过操作系统的权限控制来限制访问该文件夹的权限。例如,可以将文件存储在服务器上的某个目录下,并设置该目录的访问权限为只有特定用户或用户组才能访问。 2. Spring Security权限控制:Spring Security是Spring Boot提供的安全框架,可以通过配置基于角色或权限的访问控制规则来限制用户的访问权限。可以在下载文件的请求处理逻辑加入Spring Security的权限控制注解(如@PreAuthorize)来限制只有具有特定角色或权限的用户才能下载文件。 3. 文件下载控制器安全校验:在Spring Boot,可以创建一个文件下载的控制器,通过在该控制器进行安全校验来限制用户的下载权限。可以在控制器方法添加相关校验逻辑,如检查用户是否登录,是否具有下载文件的权限等,只有满足这些条件的用户才能成功下载文件。 综上所述,Spring Boot可以通过操作系统权限控制、Spring Security权限控制以及文件下载控制器安全校验等方式来控制文件下载的权限。根据具体的需求和实际场景,我们可以选择其一种或多种方式来实现对下载文件权限的控制。 ### 回答2: 在Spring Boot,可以使用`WebMvcConfigurer`来配置文件下载权限。 首先,需要创建一个实现`WebMvcConfigurer`接口的配置类,并重写`addResourceHandlers`方法。在该方法,可以使用`addResourceLocations`方法指定文件下载的路径,使用`addResourceHandler`方法指定访问该路径的URL,例如: ```java @Configuration public class FileDownloadConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/files/**") .addResourceLocations("file:/path/to/download/folder/"); } } ``` 上述配置,`/path/to/download/folder/`为你需要下载文件所在的文件夹路径。 然后,可以在Controller定义一个处理文件下载请求的方法,并使用`@GetMapping`注解指定访问的URL,例如: ```java @RestController public class FileDownloadController { @GetMapping("/download/{fileName}") public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws IOException { Path filePath = Paths.get("/path/to/download/folder/", fileName); Resource resource = new UrlResource(filePath.toUri()); if (resource.exists()) { return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } else { throw new FileNotFoundException("File not found: " + fileName); } } } ``` 其,`/download/{fileName}`为下载文件的URL,可以通过`@PathVariable`注解获取文件名。 在该方法,首先使用`Paths.get`方法构建文件路径,并使用`UrlResource`将该路径转换为`Resource`对象。接着判断文件是否存在,若存在则通过`ResponseEntity`将文件作为响应体返回,`CONTENT_DISPOSITION`用于指定响应头文件名。若文件不存在,则抛出`FileNotFoundException`。 综上所述,通过以上配置和方法,便可以在Spring Boot实现文件下载权限。 ### 回答3: Spring Boot是一个用于构建独立的、生产级的Spring应用程序的开源框架。在Spring Boot,可以通过配置安全权限来管理和控制文件下载的权限。 首先,需要在Spring Boot项目添加相关依赖。可以使用Spring Security依赖来实现权限管理,或者使用其他适合的授权框架。 在配置文件,可以设置路径拦截规则和相应的角色权限。可以通过配置文件或使用注解的方式来定义哪些路径需要进行权限控制。 在Controller层,可以使用注解进行权限控制的设置。可以使用@PreAuthorize注解来指定需要的角色或权限,例如@PreAuthorize("hasRole('ROLE_ADMIN')")。如果用户没有相应的角色或权限,将无法下载文件。 在下载文件的方法,可以使用FileInputStream和OutputStream等类来实现文件下载。可以通过读取文件内容和设置响应头信息等来实现文件下载。 此外,还需要在配置信息指定下载文件的存储路径和权限设置等。可以在配置文件设置下载文件路径,并通过权限设置来控制对该路径下文件的访问权限。 总结起来,Spring Boot可以通过配置安全权限来控制文件下载的权限。通过设置路径拦截规则、注解权限控制和文件下载方法等步骤,可以实现对文件下载的权限管理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值