2016-07-25 3 views
-1

У меня есть веб-приложение Struts2, работающее на сервере Tomcat 7. То, что я пытаюсь сделать, это позволить пользователю загружать файл с сервера.Struts2 File Download Permission Denied

При запуске сервера Eclipse Tomcat и доступа к localhost у меня нет проблем с загрузкой файлов.

Однако при развертывании на моем сервере, при нажатии на ссылку загрузки, я получаю следующее исключение:

java.io.FileNotFoundException: /var/tmp/myFile.pdf (Permission denied) 
    java.io.FileInputStream.open(Native Method) 
    java.io.FileInputStream.<init>(FileInputStream.java:146) 
    com.my.path.to.action.UpdateAction.execute(UpdateAction.java:201) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:606) 
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:446) 
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:285) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) 
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) 
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:544) 
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 

Вот мои действия, чтобы загрузить файл

Action.java

private InputStream fileInputStream; 

    public InputStream getFileInputStream() { 
     return fileInputStream; 
    } 

public String execute() throws Exception { 
     File fileToDownload = new File("/var/tmp/myFile.pdf"); 
     System.out.print(fileToDownload.getName()); 
     fileName = fileToDownload.getName(); 
     contentLength = fileToDownload.length(); 
     fileInputStream = new FileInputStream(fileToDownload); 
     return SUCCESS; 
    } 

Я проверил файл, чтобы убедиться, что файл существует в указанном месте, и это так. Я также ввел неправильное имя файла и получил ошибку, заявив, что не может найти указанный файл (это означает, что он может прочитать каталог и определить, что он не существует.)

Вот мой распорки.

Struts.xml

<action name="download" class="com.my.path.to.action.UpdateAction"> 
     <result name="success" type="stream"> 
       <param name="contentDisposition">attachment;filename=${fileName}</param> 
       <param name="contentType">application/doc</param> 
       <param name="inputName">fileInputStream</param> 
       <param name="bufferSize">4096</param> 
       <param name="contentLength">${contentLength}</param> 
     </result> 
</action> 

Для того, чтобы убедиться, что никто не путается, я, очевидно, изменил путь, в котором файлы доступны между траекторией Windows (который работает) и путь Linux (который не делает).

Кроме того, сервер работает на сервере Ubuntu 12.04. Если этот вопрос нужно переместить на другой форум, пожалуйста, дайте мне знать.

+0

Каковы разрешения/право собственности на '/ var/tmp/myFile.pdf'? – bradimus

+0

/var/tmp - 777 по умолчанию. running ls -l показывает, что он широко открыт. rwxrwxrwx 1 пользователь 7753786 19 июл 11:38 myFile.pdf – Zared619

ответ

0

Это проблема с разрешениями для Linux. Сервер Tomcat работает как системный пользователь. У этого пользователя нет разрешения на путь /var/tmp/. Вам нужен системный администратор, чтобы определить пользователя, который запускает Tomcat, а затем предоставить доступ к/var/tmp. И, да, этот вопрос НЕ является вопросом Java, а системным.

+0

Я тоже думал об этом. Я создал группу и сменил группу/var/tmp. Затем я добавил пользователя Tomcat в эту группу. Я думал, что это решило бы проблему, но это не так. Разве пользователь «Tomcat» не добавил. Если это не тот пользователь по умолчанию, которым управляет Tomcat. – Zared619

+0

Пользователь, которого вы упомянули, был «Tomcat» ... это действительно должно быть строчным. Посмотрите в сценарии запуска Tomcat, и вы должны найти имя пользователя. Если вы не знаете, как это сделать, вы должны перенести этот вопрос на сайт стека системного администратора. Ваш/var/tmp может быть недоступен для обычных пользователей. Вы несете ответственность за этот сервер или это ваша локальная машина? Во всяком случае, это не вопрос Java. Вы должны переместить это обсуждение. –

+0

Когда я сказал «Tomcat», это была опечатка. Я добавил пользователя «tomcat7». Я отвечаю за сервер, так как наш администратор sys на vactation (yay). Я переведу это, чтобы спросить Ubuntu. Благодарю. – Zared619