您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“springboot打成jar后獲取classpath下文件失敗怎么辦”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“springboot打成jar后獲取classpath下文件失敗怎么辦”這篇文章吧。
代碼如下:
ClassPathResource resource = new ClassPathResource("app.keystore"); File file = resource.getFile(); FileUtils.readLines(file).forEach(System.out::println);
String data = ""; ClassPathResource cpr = new ClassPathResource("static/file.txt"); try { byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream()); data = new String(bdata, StandardCharsets.UTF_8); } catch (IOException e) { LOG.warn("IOException", e); }
ClassPathResource classPathResource = new ClassPathResource("static/something.txt"); InputStream inputStream = classPathResource.getInputStream(); File somethingFile = File.createTempFile("test", ".txt"); try { FileUtils.copyInputStreamToFile(inputStream, somethingFile); } finally { IOUtils.closeQuietly(inputStream); }
Resource resource = new ClassPathResource("data.sql"); BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream())); reader.lines().forEach(System.out::println);
String content = new ClassPathResourceReader("data.sql").getContent();
@Value("${resourceLoader.file.location}") @Setter private String location; private final ResourceLoader resourceLoader; public void readallfilesfromresources() { Resource[] resources; try { resources = ResourcePatternUtils.getResourcePatternResolver(resourceLoader).getResources("classpath:" + location + "/*.json"); for (int i = 0; i < resources.length; i++) { try { InputStream is = resources[i].getInputStream(); byte[] encoded = IOUtils.toByteArray(is); String content = new String(encoded, Charset.forName("UTF-8")); } } } catch (IOException e) { throw new UncheckedIOException(e); } }
項(xiàng)目是spring-boot + spring-cloud 并使用maven 管理依賴。在springboot+maven項(xiàng)目下怎么讀取resources下的文件實(shí)現(xiàn)文件下載?
File sourceFile = ResourceUtils.getFile("classpath:templateFile/test.xlsx"); //這種方法在linux下無(wú)法工作
Resource resource = new ClassPathResource("templateFile/test.xlsx"); File sourceFile = resource.getFile();
我使用的是第二種。
@PostMapping("/downloadTemplateFile") public JSONData downloadTemplateFile(HttpServletResponse response) { String filePath = "templateFile/test.xlsx"; Resource resource = new ClassPathResource(filePath);//用來(lái)讀取resources下的文件 InputStream is = null; BufferedInputStream bis = null; OutputStream os = null; try { File file = resource.getFile(); if (!file.exists()) { return new JSONData(false,"模板文件不存在"); } is = new FileInputStream(file); os = response.getOutputStream(); bis = new BufferedInputStream(is); //設(shè)置響應(yīng)頭信息 response.setCharacterEncoding("UTF-8"); this.response.setContentType("application/octet-stream; charset=UTF-8"); StringBuffer contentDisposition = new StringBuffer("attachment; filename=\""); String fileName = new String(file.getName().getBytes(), "utf-8"); contentDisposition.append(fileName).append("\""); this.response.setHeader("Content-disposition", contentDisposition.toString()); //邊讀邊寫(xiě) byte[] buffer = new byte[500]; int i; while ((i = bis.read(buffer)) != -1) { os.write(buffer, 0, i); } os.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); return new JSONData(false,"模板文件不存在"); } catch (IOException e) { e.printStackTrace(); } finally { try { if(os != null) os.close(); if(bis != null) bis.close(); if(is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } } return new JSONData("模板文件下載成功"); }
高高興興的啟動(dòng)項(xiàng)目后發(fā)現(xiàn)還是找不到文件,錯(cuò)誤日志:
java.io.FileNotFoundException: class path resource [templateFile/test.xlsx] cannot be resolved to URL because it does not exist at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:195) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:129) at com.citycloud.parking.support.controller.operate.OperateBusinessUserController.downloadTemplateFile(OperateBusinessUserController.java:215) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
因?yàn)槲抑繰esource resource = new ClassPathResource("templateFile/test.xlsx");就是到classPath*(注意這里有個(gè)*)下去找,然后就去項(xiàng)目本地的目錄下找classPath下是否有這個(gè)文件(maven的classPath在 “target\classes”目錄下),就發(fā)現(xiàn)并沒(méi)有這個(gè)文件在。
后面仔細(xì)想想這是Maven項(xiàng)目啊,所以就找pom.xml文件去看看,突然想起:springboot的maven默認(rèn)只會(huì)加載classPath同級(jí)目錄下文件(配置那些),其他的需要配置<resources>標(biāo)簽:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!--是否替換資源中的屬性--> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.yml</include> <include>**/Dockerfile</include> <include>**/*.xlsx</include> </includes> <!--是否替換資源中的屬性--> <filtering>false</filtering> </resource> </resources> </build>
重新啟動(dòng),再到classPath下看,發(fā)現(xiàn)有了這個(gè)文件了,同時(shí)也能獲取了。如果文件名為中文的話就會(huì)出現(xiàn)亂碼的情況。
Access-Control-Allow-Origin →* Access-Control-Allow-Credentials →true Access-Control-Allow-Headers →accessToken,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers Access-Control-Allow-Methods →POST,GET,PUT,PATCH,DELETE,OPTIONS,HEAD Access-Control-Max-Age →360 Content-disposition →attachment; filename="????????-??????????.xlsx" Content-Type →application/octet-stream;charset=UTF-8 Transfer-Encoding →chunked Date →Fri, 19 Apr 2019 06:47:34 GMT
上面是使用postman測(cè)試中文亂碼response響應(yīng)頭相關(guān)信息。
后面怎么改都亂碼,然后我就試著到瀏覽器中請(qǐng)求試試,結(jié)果發(fā)現(xiàn)只是postman的原因,只要文件名編碼跟返回內(nèi)容編碼一致("Content-disposition"和“ContentType”)就行:
this.response.setContentType("application/octet-stream; charset=iso-8859-1"); StringBuffer contentDisposition = new StringBuffer("attachment; filename=\""); String fileName = file.getName(); contentDisposition.append(fileName).append("\""); //設(shè)置文件名編碼 String contentDispositionStr = new String(contentDisposition.toString().getBytes(), "iso-8859-1"); this.response.setHeader("Content-disposition", contentDispositionStr);
以上是“springboot打成jar后獲取classpath下文件失敗怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。