springboot如何获取文件流

目录
  • springboot获取文件流
  • 前端获取springboot返回的文件流的踩坑
    • 踩过坑的我给您提供一个答案
    • 两种解决方案

springboot获取文件流

在日常开发中,经常会获取项目的相对路径用以获取存放在项目路径下的资源,如获取static/ss.txt

在spring项目中,  可以用request.getRealPath("/")获取项目路径然后拼接起来,再生成流:

//拼接地址
String downLoadUrl = request.getRealPath("/") + "/static/ss.txt/" ;
// 生成流
InputStream is = new FileInputStream(downLoadUrl);

在springBoot中,request.getRealPath("/") 不能获取到项目路径,查资料得知ResourceUtils.getURL("classpath:").getPath()能获取到项目路径,测试中发现,ResourceUtils.getURL("classpath:").getPath()获取到的是项目的绝对路径,打包发版提示:

java.io.FileNotFoundException: file:/usr/local/risk_dubbo/risk-admin/20181105_161334risk-admin.war!/WEB-INF/classes!/static/ss.txt (No such file or directory)

不能用以获取项目中的资源路径。各种查资料测试得出:

String downLoadUrl = "/static/ss.txt" ;
InputStream is = this.getClass().getResourceAsStream(downLoadUrl);

可获取输入流。

前端获取springboot返回的文件流的踩坑

通过访问后台返回文件流的方式我想大家都会,这次就不展开讲了。主要想说的是向后台传递文件路径时的一些小思考!

前提是访问图片流的方式用的是restful + 动态路径填充的方式,eg: locahost:8080/test/img/1.png

如果你获取的文件路径只是文件名的话(就像我上面举的例子),文件路径就可以安全的传递到后台,完全没有问题。

但是假如你现在的文件路径为:shop/goods/title/1.png ,你应该怎么进行传递?

这样吗 -> eg: locahost:8080/test/img/shop/goods/title/1.png   仔细的人会发现这样是行不通的,因为浏览器会去匹配后台的url为: img/shop/goods/title/,对应的动态的参数为1.png;  这并不是我们想要的结果,我们想把  shop/goods/title/1.png  作为参数传递到后台,结果为报404!

那么应该怎么处理呢?聪明的同学会想到替换(replace),将  /  替换为 '-' 或者其他的操作符

假如说替换成 '-' 的话,那么应该怎么替换呢?后台接收时又应该怎么进行恢复原来的文件路径呢?

如果你选择在前台 replaceAll ,后台再进行转义回来,如果你的文件名上传到服务器不打算保存,直接存储一串数字的话应该是没有问题的!

假如现在路径参数变为   shop/goods/title/2019-04-12.png,那后台恢复文件路径的时候就变成了: shop/goods/title/2019/04/12.png ,你可能会惊讶,what?啥情况

踩过坑的我给您提供一个答案

仔细观察windows的文件命名会发现 一些禁用的字符  < > / \ | : " * ?,你会发现 / 也在其中包括,所以呢,所以呢,文件命名不可能出现 /

两种解决方案

A方案:在你确定当前目录的个数的情况下进行处理,可以写一个while循环,假如当前目录有3个,while(n<=3){ path = path.repalceFirst('-','/') },前提是目录不带 '-'  的情况下

B方案:在前端传递时,记录路径每个 '/' 的位置,然后将位置拼接到文件名最后然后传递到后台,这样即可完成精确的恢复文件路径。

说到这里,前面忘了一点:就是直接访问1.png时,为了进行路径的精确匹配,可以在后台路径映射时添加此配置: {file:.+}

说了这么多,如果你们项目中上传文件不需要保留文件名,文件名全靠自定义的话,也就不可能有这么多的事了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Springboot如何通过流返回文件

    目录 如何通过流返回文件 controller类如下 工具类DownLoadUtils如下 以流的方式直接返回 如何通过流返回文件 本人的文件是放在resource/templates目录下,截图如下 controller类如下 @GetMapping(value = "/downfile") public void download(HttpServletResponse response) throws IOException { String fileName = "t

  • SpringBoot通过请求对象获取输入流无数据

    目录 请求对象获取输入流无数据问题 方案一:禁用默认的过滤器 方案二:使用@RequestBody注解 方案三:自定义HiddenHttpMethodFilter过滤器 request输入流重复可读 自定义类继承 HttpServletRequestWrapper 定义一个过滤器 Filter 创建过滤器配置类 FilterConfig 请求对象获取输入流无数据问题 昨天下午在开发的时候遇到了奇怪的事情,在SpringBoot的Controller里面直接使用HttpServletRequest

  • springboot实现返回文件流

    目录 springboot返回文件流 springboot返回二进制文件流 springboot返回文件流 @GetMapping(value = "/file/{fileName}") public ResponseEntity<FileSystemResource> getFile(@PathVariable("fileName") String fileName) throws FileNotFoundException { File file =

  • springboot如何获取文件流

    目录 springboot获取文件流 前端获取springboot返回的文件流的踩坑 踩过坑的我给您提供一个答案 两种解决方案 springboot获取文件流 在日常开发中,经常会获取项目的相对路径用以获取存放在项目路径下的资源,如获取static/ss.txt 在spring项目中,  可以用request.getRealPath("/")获取项目路径然后拼接起来,再生成流: //拼接地址 String downLoadUrl = request.getRealPath("

  • 浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题

    图片上传功能是我们web里面经常用到的,获得的方式也有很多种,这里我用的是request.getInputStream()获取文件流的方式.想要获取文件流有两种方式,附上代码 int length = request.getContentLength();//获取请求参数长度. byte[] bytes = new byte[length];//定义数组,长度为请求参数的长度 DataInputStream dis = new DataInputStream(request.getInputSt

  • 通过FeignClient如何获取文件流steam is close问题

    目录 FeignClient获取文件流 steam is close问题 原因 解决办法 FeignClient注解参数 日志级别配置 服务超时.重试.降级和熔断 FeignClient获取文件流 steam is close问题 inputstream.read 报错 steam is close 原因 idea debug启动导致 解决办法 直接启动 FeignClient注解参数 name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服

  • SpringBoot+fileUpload获取文件上传进度

    我本人在网上找了很多关于文件上传进度获取的文章,普遍基于spring MVC 框架通过 fileUpload 实现,对于spring Boot 通过 fileUpload 实现的帖子非常少,由于小弟学艺不精,虽然 Spring Boot 和 Spring MVC 相差不大,只是配置方式的差别,还是搞了很久,上传此文章的目的是希望自己作为文本保留,以便日后查看备忘,并且希望通过我的例子可以帮助到其他人而已,如果各位大佬发现小弟对于某些知识有误解,还请不吝赐教,先谢谢各位前辈了! 写此篇文章之前我查

  • React获取Java后台文件流并下载Excel文件流程解析

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(HttpServletResponse response, String fileName, String sheetName, List<String> titleRow, List<List<String>> dataRows) { OutputStream out = nu

  • Java 如何获取url地址文件流

    目录 获取url地址文件流 根据url获取文件的二进制 上代码 获取url地址文件流 /** * 根据url下载文件流 * @param urlStr * @return */ public static InputStream getInputStreamFromUrl(String urlStr) { InputStream inputStream=null; try { //url解码 URL url = new URL(java.net.URLDecoder.decode(urlStr,

  • JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注释掉,浏览器会默认预览. response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path)); 然后需要注意: response.s

  • SpringBoot如何获取src/main/resource路径下的文件

    目录 SpringBoot获取src/main/resource路径下的文件 SpringBoot打成jar包后,读取resources目录下的文件 一般方法 正确方法 SpringBoot获取src/main/resource路径下的文件 下面的ResourceUtils使用spring-core的工具包,在org.springframework.util包下 File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFI

  • C#远程获取图片文件流的方法

    本文实例讲述了C#远程获取图片文件流的方法.分享给大家供大家参考,具体如下: protected void Page_Load(object sender, EventArgs e) { WebRequest myrequest = WebRequest.Create("http://xxxxx/userface.jpg"); WebResponse myresponse = myrequest.GetResponse(); Stream imgstream = myresponse.

随机推荐