2017-10-26 13 views
4

は、私は、サーバーにファイルをアップロードし、そこにそれらを保存する必要があります。?私Vaadin春ブートアプリケーションで

デスクトップにローカルでファイルをアップロードするとうまくいきます。 しかし、私はアプリケーションをサーバーにデプロイしたいので、アップロードしたファイルを自分のアプリケーションのベースパスに相対的なディレクトリに保存します。

私は、ルートアプリケーションフォルダ(のapplicationName - > INPUT_FILES)の直接の子として「INPUT_FILES」というフォルダを作成しました。ファイルがアップロードされると、ファイルの内容は、この「INPUT_FILES」フォルダ内に新しく作成されたファイルに書き込まれるようになっています。

コード:コードの

class FileReceiver implements Upload.Receiver, Upload.SucceededListener { 
    private File file; 

    public OutputStream receiveUpload(String filename, String mimeType) { 
    String basePath = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();     
    FileOutputStream fileOutputStream; 

    try { 
     //this line would work: 
     //file = new File("/Users/username/Desktop/input_files/" + filename);   

     //this line does not work: 
     file = new File(basePath + "/input_files/" + filename); 


     fileOutputStream = new FileOutputStream(file); 
     labelFilename.setCaption(filename); 
    } 
    catch (final java.io.FileNotFoundException e) { 
     new Notification("Could not open file", e.getMessage(), Notification.Type.ERROR_MESSAGE).show(Page.getCurrent()); 
     return null; 
    } 
    return fileOutputStream; 
    } 

    public void uploadSucceeded(Upload.SucceededEvent event) { 

    } 
}; 

重要な行はこれです:

file = new File(basePathOfApplication + "/input_files/" + filename); 

この行は動作しません。 input_filesフォルダ内にファイルは作成されません。

******************************** UPDATE ************* *********************

画面上に表示さ

エラーメッセージ:コンソールで

enter image description here

エラーメッセージ:

com.vaadin.server.UploadException: Upload failed 
    at com.vaadin.server.communication.FileUploadHandler.streamToReceiver(FileUploadHandler.java:631) [vaadin-server-8.1.0.jar:8.1.0] 
    at com.vaadin.server.communication.FileUploadHandler.handleFileUploadValidationAndData(FileUploadHandler.java:460) [vaadin-server-8.1.0.jar:8.1.0] 
    at com.vaadin.server.communication.FileUploadHandler.doHandleSimpleMultipartFileUpload(FileUploadHandler.java:413) [vaadin-server-8.1.0.jar:8.1.0] 
    at com.vaadin.server.communication.FileUploadHandler.handleRequest(FileUploadHandler.java:290) [vaadin-server-8.1.0.jar:8.1.0] 
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1568) [vaadin-server-8.1.0.jar:8.1.0] 
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:381) [vaadin-server-8.1.0.jar:8.1.0] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar:8.5.16] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] 
Caused by: com.vaadin.server.NoOutputStreamException: null 
    at com.vaadin.server.communication.FileUploadHandler.streamToReceiver(FileUploadHandler.java:559) [vaadin-server-8.1.0.jar:8.1.0] 
    ... 43 common frames omitted 
+0

VaadinService.getCurrent()。getBaseDirectory()。getAbsolutePath();を使用すると、どのようなエラーが発生しますか? ? – pan

+0

ご意見ありがとうございました...私は自分の投稿を更新しました。これには、(画面とコンソールの)エラーメッセージも含まれています。 –

答えて

4

は、アプリケーションがディレクトリ/private/var/...にファイルを作成できることを確認してください。おそらく、それはできません。私はVaadinについてはあまりよく分かりませんが、フォルダ自体は、アプリケーションに必要な展開されていないクラスやデータを格納するための "読み取り専用"/"一時"ディレクトリです。このディレクトリは、アップロードや動的コンテンツを格納することを目的としていない可能性があります。

documentation状態:

コンテキストベース・ディレクトリを返します。通常、アプリケーションはアプリケーションディレクトリを持つような方法でデプロイされます。 Webアプリケーションの場合、このディレクトリはWebアプリケーションのルートディレクトリです。場合によっては、アプリケーションにアプリケーションディレクトリ(たとえば、戦争の中で実行されているWebアプリケーション)がないかもしれません。

だから、nullであることもあります。この場合もコードが壊れてしまいます。

IMHOの場合は、アプリケーションの設定で指定できるアップロード専用の別のディレクトリを使用することをお勧めします。または、よく知っている場所(/tmpなど)を使用してください。

また、親ディレクトリは、最初にfile.getParentFile().mkdirs()で作成してください。

2

あなたはapp.getContext().getBaseDirectory()

  • ノート内のファイル保存する必要があり、Vaadin forumによると、Vaadinサービスに

    を、ファイルを保存するべきではありません。アプリはあなたが確認することができcom.vaadin.Application

ですSample動作しない場合のためにプロパティをチェックする:

// cannot access example directory, possible security issue with 
// Application Server or Servlet Container 
// Try to read sample directory from web.xml parameter 
if (application.getProperty("sampleDirectory") != null) { 
       file = new File(application.getProperty("sampleDirectory")); 
       if ((file != null) && (file.canRead()) 
         && (file.getAbsolutePath() != null)) { 
        // Success using property 
        return file; 
       } 
-1

あなたのフォルダにアクセス権を持っていない、/tmpはその後

drwxrwxrwt 15 root root 4.0K Nov 4 20:23 tmp 

使用sudo chmod 777 /opt/myapp/input_files/

を持っているようなあなたのコードを実行しようとし、それを完全なアクセス許可を与えることを試みます。

注:私は/ opt/useを使用していますが、他のフォルダも使用できますが、許可を与えることを忘れないでください。

関連する問題