2011-01-12 8 views
0

私はcsvファイルをブラウズしてサーバーにアップロードするファイル入力フィールドを持つJSPページを持っています。私はこのファイル入力フィールドが存在する形式でmethod = "POST"とENCTYPE = 'multipart/form-data'を使用しています。アップロード中にサーバー上のファイルコンテンツを受け取ることができません

サーブレット側(アプリケーションのサーブレット内)では、Apacheの共通ファイルアップロードAPI-ServletFileUpload APIを使用しています。このAPIのメソッドparseRequest(request)からFileItemリストを取得した後、FileItem APIのgetName()メソッド、getString()メソッドを使用してファイル名とその内容を取得できません。

私が間違っていることや、自分のアプリケーションが動作するようにする私のアプローチの変更を知る必要があります。これに関するポインタは参考になります。

ありがとうございます!

は、アプリケーションのメイン・サーブレットのdoPostメソッドで次のコードを試みた: -

を `列挙enumAttrib = request.getAttributeNames()。

while(enumAttrib.hasMoreElements()) { 
     String attribName = (String)(enumAttrib.nextElement()); 
     System.out.println("DEBUG:---------AttribName = " + attribName); 
     System.out.println("DEBUG:---------AttribValue=" + request.getAttribute(attribName)); 
    }` 

た印刷しまっ出力:

DEBUG:---------AttribName = weblogic.servlet.network_channel.port 
DEBUG:---------AttribValue=9703 

はリクエストパラメータもこれだけまたは他の属性を返すべきかどうかわかりません。

はまた、次のコードを試みた:

if (ServletFileUpload.isMultipartContent(request)) { 

     System.out.println("Inside ApplicationMainServlet request is multipart "); 

     // Create a factory for disk-based file items 
     FileItemFactory factory = new DiskFileItemFactory(); 

     // Create a new file upload handler 
     ServletFileUpload upload = new ServletFileUpload(factory); 

     try 
     { 
      // Parse the request 

      List /* FileItem */items = upload.parseReques(request); 

      // Process the uploaded items 

      Iterator iter = items.iterator(); 

      while (iter.hasNext()) 
      { 
       FileItem item = (FileItem) iter.next(); 
       String name = item.getFieldName(); 

       System.out.println("ApplicationMainServlet name: "+item.getFieldName() + ", val: "+item.getString()); 

       if (!item.isFormField()) 
       { 
        //Item is a file 

       try{ 

        InputStream is = item.getInputStream(); 

        InputStreamReader ir = new InputStreamReader(is); 

        BufferedReader br = new BufferedReader(ir); 

        System.out.println("br : " + br); 

        String fileContent = ""; 

        String strLine; 

        while((strLine = br.readLine()) != null){ 

         System.out.println("strLine : " + strLine); 

         if(fileContent != null) 
         { 
          fileContent = fileContent+ strLine + "\n"; 
         } 
         else 
         { 
          fileContent = strLine + "\n"; 
         } 
        } 

        System.out.println("fileContent : " + fileContent); 
        } catch(Exception e){ 
         e.printStackTrace(); 
        } 

        System.out.println("ApplicationMainServlet file name " + item.getName()+",size "+item.getSize());      

       } 
      } 
+0

ファイルのアップロードコードを投稿できますか? – Casey

+0

public void doProcess(HttpServletRequestリクエスト、HttpServletResponseレスポンス) ServletException、IOExceptionをスローします{ – Khushal

+0

FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload =新しいServletFileUpload(ファクトリ);リストアイテム= upload.parseRequest(リクエスト);イテレータiter = items.iterator(); while(iter.hasNext()){FileItem item =(FileItem)iter.next(); if(item.isFormField()){//ログに出力される出力は、Val =(空白)およびsize = 0です。System.out.println( "ApplicationMainServlet:name =" + item.getFieldName()+ " val = "+ item.getString()+"、ファイルサイズ= "+ item.getSize()); request.setAttribute(name、item); //追従するコード – Khushal

答えて

0

は、あなたは必ずあなたのdoProcess方法が呼び出されていますか?このコードブロックの前のどこかにあるSystem.outメッセージを配置しましたか?

また、ファイルアップロードのフォームをどのように宣言していますか?あなたはmultipart/form-dataに、フォーム上のenctypeを設定する必要があります。

<form enctype="multipart/form-data" name="uploadForm" action="uploadFormAction"> 
</form> 

あなたのコードのほとんどが多分読み少し楽Apache documentation

if (!item.isFormField()) { 
    System.out.println("ApplicationMainServlet: name = " + item.getFieldName() + ", val = " + item.getString() + ", file size = " + item.getSize()); 
} 

に基づいて修正しているように見えます:

if (!item.isFormField()) { 
    String fieldName = item.getFieldName(); 
    String fileName = item.getName(); 
    long sizeInBytes = item.getSize(); 
    System.out.println("ApplicationMainServlet: name = " + fieldName + ", val = " + fileName + ", file size = " + sizeInBytes); 
} 

そのショットを与えて、それが機能するかどうかを確認します。

+0

問題は、サーバー側でファイルの内容を送信できないことです。私はあなたの言葉通りに正確にフォームを宣言しました。 doPostメソッドは、ログ内のsysoutステートメントから確認されて取得されています。コントロールはif条件(!item.isFormField())の中に入りますが、fileName、sizeまたはその内容を取得しようとしているときに何も印刷されません。私はまた、FileItemオブジェクトのinputStreamを取得しようとし、行ごとにファイルの内容を印刷しようとしましたが、これも失敗します。 – Khushal

+0

私は、ファイルの内容がMIMEストリームとしてサーバーに送信されるため、ファイルの内容を取得するための通常の方法が機能していないと感じています。 – Khushal

+0

どのような種類のファイルですか?別のブラウザを試しましたか? – Casey

関連する問題