2017-05-08 5 views
0

私は非常に単純なGWTアプリケーションを作成しようとしています。ユーザーはtxtファイルを選択してサーバーにアップロードできます。その後、私はより多くの機能を実装したいが、今の私はのFileUploadにこだわっている:サーブレット付きGWT FileUpload

クライアント側で、私は次のコードの作業があります。私のサーバー側で

public class GwtDemoProject implements EntryPoint { 

private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload"; 

private FormPanel form; 
private Label info; 
private FileUpload fileupload; 
private Button uploadFileBtn; 

public void onModuleLoad() { 

    init(); 

    uploadFileBtn.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      String filename = fileupload.getFilename(); 

      if(filename.length() == 0) { 
       Window.alert("File Upload failed"); 
      } else if(filename.endsWith(".txt")) { 

       form.submit(); 

      } else { 
       Window.alert("File is not a txt-file"); 
      } 
     } 
    });  

    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
     @Override 
     public void onSubmitComplete(SubmitCompleteEvent event) { 

      if(event.getResults().length() == 0) { 

      } else { 
       Window.alert(event.getResults()); 
      } 
     } 
    }); 


    VerticalPanel vp = new VerticalPanel(); 
    vp.add(info); 
    vp.add(fileupload); 
    vp.add(new HTML("<br>")); 
    vp.add(uploadFileBtn); 

    form.add(vp); 
    RootPanel rp = RootPanel.get(); 
    rp.add(form); 
} 

private void init() { 
    form = new FormPanel(); 
    form.setAction(UPLOAD_ACTION_URL); 
    form.setEncoding(FormPanel.ENCODING_MULTIPART); 
    form.setMethod(FormPanel.METHOD_POST); 

    info = new Label("Wähle eine Textdatei aus"); 

    fileupload = new FileUpload(); 

    uploadFileBtn = new Button("Upload File"); 
} 
} 

を私は次のように作られた。

web.xmlに
public class FileUploadServlet extends HttpServlet 
{ 

private static final long serialVersionUID = 1L; 

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html");  

    try { 
     DiskFileItemFactory factory = new DiskFileItemFactory();    

     ServletFileUpload upload = new ServletFileUpload(factory); 


     List<FileItem> items = upload.parseRequest(request); 

     Iterator<FileItem> iter = items.iterator(); 
     while (iter.hasNext()) { 
      FileItem item = iter.next(); 

      File uploadedFile = new File("C:\\samplePath\\"+item.getName()+".txt"); 
      item.write(uploadedFile); 

     } 


    } catch (Exception exc) { 

    } 
} 
} 

私は、サーブレットに次を追加しました:

<!-- Servlets --> 
    <servlet> 
     <servlet-name>uploadServlet</servlet-name> 
     <servlet-class>de.gwt.demo.server.FileUploadServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>uploadServlet</servlet-name> 
     <url-pattern>/gwtdemoproject/upload</url-pattern> 
    </servlet-mapping> 

エラーメッセージは表示されませんが、サーブレットのListは空であるため、whileループは実行されません。リクエストや送信に何か問題がありますか?

+0

質問する前にhttp://stackoverflow.com/questions/1111130/basic-file-upload-in-gwtをチェックしましたか?あなたがしていないと言っているわけではなく、あなたがしたかどうかを知りたいだけです。 – walen

+0

firefox/chromeの開発ツールを使用して、ネットワーク上の状況を教えてください。 http取得リクエストはありますか?そして、もしどのHTTPステータスコードがリクエストの結果であるのであれば? – Akkusativobjekt

+0

@Akkusativobjekt私は何とか私の問題を解決しました - 私はそれを回答として投稿し、変更を強調するつもりです – KilledByCheese

答えて

0

私はコードにいくつかの変更を加えました: アプリケーションレイアウトを変更しました:アップロードしたtxtファイルの内容を表示するTextAreaを追加しました。今、この非常に単純なアプリケーションは、txtファイルを取得してサーバーにアップロードし、保存されます。次に、サーバーはtxtファイルを読み取り、クライアントにコンテンツを送信し、保存されたファイルを削除します。

主な変更点:解析されたリストが空の場合、私はチェックを追加したサーバ側のサーブレットで

public class GwtFileUploadDemo implements EntryPoint { 

private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload"; 

private FormPanel form; 
private Label info; 
private FileUpload fileupload; 
private Button uploadFileBtn; 
private TextArea outputText; 

public void onModuleLoad() { 

    init(); 

    uploadFileBtn.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      String filename = fileupload.getFilename(); 

      if(filename.length() == 0) { 
       Window.alert("File Upload failed"); 
      } else if(filename.endsWith(".txt")) { 

       form.submit();   

      } else { 
       Window.alert("File is not a txt file"); 
      } 
     } 
    }); 


    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
     @Override 
     public void onSubmitComplete(SubmitCompleteEvent event) { 

      if(event.getResults().length() == 0) { 
       Window.alert("Something went wrong - Try again"); 
      } else { 
       outputText.setText(event.getResults());     
      } 
     } 
    }); 


    VerticalPanel vp = new VerticalPanel(); 
    vp.add(info); 
    vp.add(fileupload); 
    vp.add(new HTML("<br>")); 
    vp.add(uploadFileBtn); 
    vp.add(outputText); 

    form.add(vp); 
    RootPanel rp = RootPanel.get(); 
    rp.add(form); 
} 

private void init() { 
    form = new FormPanel(); 
    form.setAction(UPLOAD_ACTION_URL); 
    form.setEncoding(FormPanel.ENCODING_MULTIPART); 
    form.setMethod(FormPanel.METHOD_POST); 

    info = new Label("Choose a txt file"); 

    fileupload = new FileUpload(); 

    //Here I added a name to the fileuploader 
    fileupload.setName("uploader"); 

    uploadFileBtn = new Button("Show content of txt File"); 

    outputText = new TextArea(); 
    outputText.setEnabled(false); 
} 
} 

私は、ファイルアップロードに名前を与えました。 パス、名前、およびファイルパスを使用してファイルを作成します。それから私はBufferedReaderの付いたファイルを読んで、私は応答して、コンテキストを書く:

public class FileUploadServlet extends HttpServlet 
{ 

private static final long serialVersionUID = 1L; 

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

    System.out.println("Inside doPost"); 

    try { 
     if (!ServletFileUpload.isMultipartContent(request)) {         
      throw new FileUploadException("error multipart request not found");    
     }  

     DiskFileItemFactory factory = new DiskFileItemFactory();    

     ServletFileUpload upload = new ServletFileUpload(factory); 

     List<FileItem> items = upload.parseRequest(request); 

     if (items == null) {    
      response.getWriter().write("File not correctly uploaded"); 
      return; 
     } 

     Iterator<FileItem> iter = items.iterator(); 

     while (iter.hasNext()) { 
      FileItem item = iter.next(); 
      System.out.println("Start writing File"); 

      String uploadPath = "."; 
      String fileName = new File(item.getName()).getName(); 
      String filePath = uploadPath + File.separator + fileName; 

      System.out.println("File-Pfad:" + filePath);   

      File uploadedFile = new File(filePath); 
      item.write(uploadedFile);    

      String content = ""; 

      FileReader fileReader = new FileReader(filePath); 

      BufferedReader bufferedReader = new BufferedReader(fileReader); 

      String line = null; 

      while((line = bufferedReader.readLine()) != null) { 
       content = content + line + "\n"; 
      } 

      bufferedReader.close(); 

      PrintWriter out = response.getWriter(); 
      response.setHeader("Content-Type", "text/html"); 
      out.println(content); 
      out.flush(); 
      out.close(); 

      uploadedFile.delete(); 

      System.out.println("Finished reading File"); 
     } 

    } catch (Exception exc) { 
     exc.printStackTrace(); 
     PrintWriter out = response.getWriter(); 
     response.setHeader("Content-Type", "text/html"); 
     out.println("Error"); 
     out.flush(); 
     out.close(); 
    } 
    System.out.println("FileUploadServlet doPost end"); 
} 
} 

私は名前を追加した後、私はコードをテストしたため、問題は、私はファイルアップロードに名前を付けるのを忘れていることだったと思うし、突然、私のファイルを書くことでエラーが発生しました。

関連する問題