首页 > 解决方案 > 在 Java/Springboot 中创建文件时权限被拒绝错误 - Tomcat

问题描述

我正在尝试在 Java/SpringBoot 中创建一个文件并使用 FileWriter 方法写入它。下面是我的代码。

                String filename = file.csv;
                LOGGER.info("Creating File CSV");
                File file = new File(filename);
                Boolean Isexists =file.exists();
                boolean isexistsabs = file.getAbsoluteFile().exists();
                LOGGER.info("CSV File Exists? : "+Isexists);
                LOGGER.info("CSV File ABSExists? : "+isexistsabs);
                boolean setwritable = file.setWritable(true);
                LOGGER.info("SetWritable CSV Output : "+Boolean.toString(setwritable));
                boolean setExecutable = file.setExecutable(true);
                LOGGER.info("SetExecutable CSV Output : "+Boolean.toString(setExecutable));
                LOGGER.info("before file Writer CSV");
                FileWriter filewriter = new FileWriter(filename);
                LOGGER.info("after file Writer CSV");
                LOGGER.info("Writing File CSV");
                String content ="Some CSV Content";
                filewriter.write(content);
                LOGGER.info("Written to File CSV");
                filewriter.close();
                LOGGER.info("Closing File CSV");

当我在本地系统中执行代码时,它正在工作,下面是代码的日志

2020-07-28 00:56:17.204  INFO 15956 --- Controller       : Creating File CSV
2020-07-28 00:56:17.205  INFO 15956 --- Controller       : CSV File Exists? : true
2020-07-28 00:56:17.206  INFO 15956 --- Controller       : CSV File ABSExists? : true
2020-07-28 00:56:17.206  INFO 15956 --- Controller       : SetWritable CSV Output : true
2020-07-28 00:56:17.207  INFO 15956 --- Controller       : SetExecutable CSV Output : true
2020-07-28 00:56:17.207  INFO 15956 --- Controller       : before file Writer CSV
2020-07-28 00:56:17.208  INFO 15956 --- Controller       : after file Writer CSV
2020-07-28 00:56:17.209  INFO 15956 --- Controller       : Writing File CSV
2020-07-28 00:56:17.209  INFO 15956 --- Controller       : Written to File CSV
2020-07-28 00:56:17.210  INFO 15956 --- Controller       : Closing File CSV

但是,当我在部署到下面的 tomcat 服务器后执行相同操作时,我收到的日志/错误是

2020-07-27 14:34:15.465  INFO 17902 --- Controller       : Creating File CSV
2020-07-27 14:34:15.465  INFO 17902 --- Controller       : CSV File Exists? : false
2020-07-27 14:34:15.465  INFO 17902 --- Controller       : CSV File ABSExists? : false
2020-07-27 14:34:15.466  INFO 17902 --- Controller       : SetWritable CSV Output : false
2020-07-27 14:34:15.466  INFO 17902 --- Controller       : SetExecutable CSV Output : false
2020-07-27 14:34:15.466  INFO 17902 --- Controller       : before file Writer CSV
2020-07-27 14:34:15.488 ERROR 17902 --- [http-nio-8080-exec-31] o.s.b.w.servlet.support.ErrorPageFilter  : Forwarding to error page from request [/api/getFlighPlanCSV] due to exception [file.csv (Permission denied)]

java.io.FileNotFoundException: file.csv (Permission denied)
    at java.base/java.io.FileOutputStream.open0(Native Method) ~[na:na]
    at java.base/java.io.FileOutputStream.open(FileOutputStream.java:291) ~[na:na]
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:234) ~[na:na]
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123) ~[na:na]
    at java.base/java.io.FileWriter.<init>(FileWriter.java:66) ~[na:na]
    at com.aiknights.com.rapidviewmain.controller.SiteInspectionController.DownloadFlightPlan(SiteInspectionController.java:175) ~[classes/:0.0.1-SNAPSHOT]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE]

写入文件时似乎出错,说找不到文件,似乎 application/.war 由于权限问题而无法在 PWD 中创建文件。

My application name - applicationmain.war
resides at - /opt/tomcat/webapps/applicationmain.war
there is also a folder created whenever I deploy the war file - /opt/tomcat/webapps/applicationmain
I tried assiging all permissions to both the war file itself and the folder that is created when deploying the war file with no luck

我将回答任何询问有关设置和代码的更多详细信息的评论。

任何形式的帮助都会非常感激,因为我已经花了太多时间来处理这个问题。

标签: javalinuxspringspring-boottomcat

解决方案


确保您还具有对所有父目录的读取和执行权限。

例子:

chmod o+x /opt

推荐阅读