2011-12-28 26 views
1

ローカルファイルをGAEサーバーにアップロードして処理できるWebアプリケーションを開発しようとしました。私はFileUploadウィジェットを使ってこれを達成しようとしましたが、ファイルがhttpリクエストによって正常にアップロードできなかったようです。クライアント側のコードは、このGWT FileUpload Servletがファイルの内容を取得できませんでした

private void loadLocalDataDialog() 
{ 
    final DialogBox loadBox = new DialogBox(); 
    loadBox.setText("Upload Local Files"); 

    final FormPanel form = new FormPanel(); 
    form.setWidth("275px"); 
    form.setEncoding(FormPanel.ENCODING_MULTIPART); 
    form.setMethod(FormPanel.METHOD_POST); 
    form.setAction(GWT.getModuleBaseURL() + "FileUploadServlet"); 

    VerticalPanel vp = new VerticalPanel(); 
    vp.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT); 
    form.setWidget(vp); 

    final FileUpload uploader = new FileUpload(); 
    uploader.setName("uploadlocalfile"); 
    vp.add(uploader); 

    loadBox.add(vp); 
    loadBox.center(); 

    HorizontalPanel buttonPanel = new HorizontalPanel(); 

    buttonPanel.add(new Button("Cancel", new ClickHandler() 
    { 
     @Override 
     public void onClick(ClickEvent event) 
     { 
      // TODO Auto-generated method stub 
      loadBox.hide(); 
     } 
    })); 

    buttonPanel.add(new Button("Submit", new ClickHandler() 
    { 
     @Override 
     public void onClick(ClickEvent event) 
     { 
      // TODO Auto-generated method stub 
      form.submit(); 
     } 
    })); 

    vp.add(buttonPanel); 

    form.addSubmitHandler(new FormPanel.SubmitHandler() 
    { 
     @Override 
     public void onSubmit(SubmitEvent event) 
     { 
      // TODO Auto-generated method stub 
      String fileName = uploader.getFilename(); 

      if(fileName.length() == 0) 
      { 
       Window.alert("Error: no file is selected. Please select a file to be uploaded."); 
       event.cancel(); 
      } 
      else if(!fileName.endsWith("xml") && !fileName.endsWith("json") && !fileName.endsWith("csv")) 
      { 
       Window.alert("Error: file format not supported. Only supports XML, CSV and JSON"); 
       event.cancel(); 
      } 
      else 
       loadBox.hide(); 
     } 
    }); 

    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() 
    { 
     @Override 
     public void onSubmitComplete(SubmitCompleteEvent event) 
     { 
      // TODO Auto-generated method stub 
      Window.alert(event.getResults()); 
     } 
    }); 
} 

のように見えます

私はオンラインいくつかの研究を行っている、と私が見つけた最もソリューションはのFileUploadウィジェットは名前を持っていないので、それが言いました。しかし、あなたが見ることができるように、私はすでにウィジェットの名前を設定しているので、何が間違っているのかわからない。

そして、ここに私のサーバー側のコードは次のとおりです。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.*; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

@SuppressWarnings("serial") 
public class FileUploadServlet extends HttpServlet 
{ 
@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    if(ServletFileUpload.isMultipartContent(request)) 
    { 
     response.setContentType("text/plain"); 

     ServletFileUpload upload = new ServletFileUpload(); 
     InputStream is = null; 

     try 
     { 
      FileItemIterator iterator = upload.getItemIterator(request); 
      while(iterator.hasNext()) 
      { 
       FileItemStream item = iterator.next(); 

       if(item.getFieldName().equals("uploadlocalfile") && !item.isFormField()) 
       { 
        is = item.openStream(); 
        break; 
       } 
      } 

      if(is == null) 
       response.getWriter().write("No Data"); 
      else 
      { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 

       while((line = reader.readLine()) != null) 
        sb.append(line + "\n"); 
       reader.close(); 

       response.getWriter().write(sb.toString()); 
      } 
     } 
     catch (FileUploadException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    else 
     response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "Request contents type is not supported by the servlet."); 
} 
} 

は、どんなに私が転送どのファイル、イテレータは何も返さないと「データなし」は常に印刷されます。

私はServletFileUpload.parseRequestアプローチを試しましたが、どちらもうまくいきません。

アイデアありがとうございます!ありがとう。

編集:以下は、この機能

<servlet> 
<servlet-name>loadLocalFile</servlet-name> 
<servlet-class>com.meng.climatevisualizeapp.server.FileUploadServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
<servlet-name>loadLocalFile</servlet-name> 
<url-pattern>/climatevisualizeapp/FileUploadServlet</url-pattern> 
</servlet-mapping> 

編集に関連している私のweb.xmlファイルの一部です:これは、HTTPリクエストが二回解析されたという事実に起因することができます。しかし、私は最初の解析がどこで発生したのか把握できませんでした。

答えて

0

サーブレットに移動しますか?

投稿されていないため、web.xmlの設定方法はわかりません。サーブレットに到達していない場合は、web.xmlに適切に定義されていることを確認する必要があります。

gwt.xmlファイルをダブルチェックして、サーブレットマッピング用のweb.xmlファイルの '/ url paternと/ FileUploadServletが一致するようにします。

正しく名前が付けられマッピングされている場合は、サーブレットにアクセスします。ブレイクポイントを持つサーブレットを起動して、まずそのポイントに到達していることを確認します。次に、各行をステップ実行して、どの行がエラーをスローするかを確認します。オブジェクトを初期化していないか、サーブレットが正しく設定されていないなど...

まず、明白なことをまず確認します。

お探しの情報がありましたら教えてください。

+0

ああ、私はweb.xmlファイルを設定しました。申し訳ありませんが投稿していません。私は質問を編集します。 – mpang

+0

ご返信ありがとうございます。私は自分のプログラムを踏んだところで、要求からFileItemStreamのインスタンスが解析されていないことが判明しました。結果として、iterator.hasNext()はすぐにfalseを返します。 – mpang

+0

サーブレットに到達したリクエストの内容は何ですか?このようなものを使用してください:Enumeration enumeration = request.getParameterNames();および/またはgetParameterValues()を参照してください。 –

関連する問題