2013-03-31 19 views
14

プロジェクトを作成してファイルをアップロードする必要があります。 したがって、enctype = "multipart/form-data"を使用しています。サーブレットはtomcat 7のマルチパートフォームからパラメータを取得します

しかし、リクエストからパラメータを解析できません。 私もgetPartを試しましたが、空の文字列を返しています。

サーブレットコード - >

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.List; 

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

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class upload_wall extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    // location to store file uploaded 
    private static final String UPLOAD_DIRECTORY = "image_upload"; 
    // upload settings 
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB 
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB 
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 

     // checks if the request actually contains upload file 
     if (!ServletFileUpload.isMultipartContent(request)) { 
      // if not, we stop here 
      PrintWriter writer = response.getWriter(); 
      writer.println("Error: Form must has enctype=multipart/form-data."); 
      writer.flush(); 
      return; 
     } 

     // configures upload settings 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     // sets memory threshold - beyond which files are stored in disk 
     factory.setSizeThreshold(MEMORY_THRESHOLD); 
     // sets temporary location to store files 
     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     ServletFileUpload upload = new ServletFileUpload(factory); 

     // sets maximum size of upload file 
     upload.setFileSizeMax(MAX_FILE_SIZE); 

     // sets maximum size of request (include file + form data) 
     upload.setSizeMax(MAX_REQUEST_SIZE); 

     // constructs the directory path to store upload file 
     // this path is relative to application's directory 
     String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; 

     // creates the directory if it does not exist 
     File uploadDir = new File(uploadPath); 
     if (!uploadDir.exists()) { 
      uploadDir.mkdir(); 
     } 

     try { 
      @SuppressWarnings("unchecked") 
      List<FileItem> formItems = upload.parseRequest(request); 
      String fileName1 = ""; 
      if (formItems != null && formItems.size() > 0) { 
       for (FileItem item : formItems) { 
        // processes only fields that are not form fields 
        if (!item.isFormField()) { 
         String fileName = new File(item.getName()).getName(); 
         fileName1 += fileName; 
         String filePath = uploadPath + File.separator + fileName; 
         File storeFile = new File(filePath); 
         // saves the file on disk 
         item.write(storeFile); 
        } 
       } 
      } 
      String p_text = request.getParameter("p_data"); 
      String gallery_nm = request.getParameter("upload_wall_gallery"); 
      out.println(p_text); 
      out.println(gallery_nm); 
      //out.println("Upload has been done successfully!"+fileName1); 
     } catch (Exception ex) { 
      out.println(ex.getMessage()); 
     } 

    } 

} 

Iネットやstackoverflowの上の作業例を見つけることができません。

簡単な解決方法はありますか?

答えて

22

問題はここにある:How to upload files to server using JSP/Servlet? answerから

String p_text = request.getParameter("p_data"); 
String gallery_nm = request.getParameter("upload_wall_gallery"); 

、あなたはtrueを返すisFormField()方法FileItemとしてあなたのパラメータを取得する必要があります。答えから関連するコードの断片を投稿:

for (FileItem item : formItems) { 
    if (item.isFormField()) { 
     // Process regular form field (input type="text|radio|checkbox|etc", select, etc). 
     String fieldname = item.getFieldName(); 
     String fieldvalue = item.getString(); 
     // ... (do your job here) 
    } else { 
     // Process form file field (input type="file"). 
     String fieldname = item.getFieldName(); 
     String filename = FilenameUtils.getName(item.getName()); 
     InputStream filecontent = item.getInputStream(); 
     // ... (do your job here) 
    } 
} 

ソリューション:if (!item.isFormField())を呼び出すときelseセクションに取り扱うお使いの他のリクエストパラメータを動かします。

for (FileItem item : formItems) { 
    // processes only fields that are not form fields 
    if (!item.isFormField()) { 
     String fileName = new File(item.getName()).getName(); 
     fileName1+=fileName; 
     String filePath = uploadPath + File.separator + fileName; 
     File storeFile = new File(filePath); 
     // saves the file on disk 
     item.write(storeFile); 
    } else { 
     //here... 
     String fieldname = item.getFieldName(); 
     String fieldvalue = item.getString(); 
     if (fieldname.equals("p_data")) { 
      //logic goes here... 
     } else if (fieldname.equals("upload_wall_gallery")) { 
      //next logic goes here... 
     } 
    } 
} 
+0

ありがとうございました、あなたがここに新しいので、 –

+0

@LovepreetSinghBatthになりました。評判の下のチェックをクリックして、この投稿に回答をマークしてください。 –

3

そのmultipart/form-data形以来request.getParameter()への呼び出しは常にnullを返します。この場合、あなたがしなければならないことは、すべてがうまく動作することを望むでしょう。

if (item.isFormField()) { 
    System.out.println("Got a form field: " + item.getFieldName()+ " " +item.getString()); 
} else { 
    // it is a file process, the way you are doing it 
} 

+0

ありがとう、ありがとうございました –

+1

あなたがうまくいけば、この回答を受け入れることができます。それは将来のユーザーを助ける:)。 – kaysush

関連する問題