2013-03-31 25 views
14

Lập dự án và cần tải tệp lên. Vì vậy, tôi đang sử dụng enctype = "multipart/form-data" thông báo.Servlet lấy thông số từ nhiều hình thức trong tomcat 7

Nhưng tôi không thể phân tích cú pháp tham số từ yêu cầu. Tôi cũng đã thử getPart nhưng nó trả về chuỗi trống.

đang Servlet ->

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()); 
     } 

    } 

} 

tôi không thể tìm thấy một ví dụ làm việc trên net hoặc stackoverflow.

Bất kỳ giải pháp đơn giản nào?

Trả lời

22

Vấn đề là ở đây:

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

Từ How to upload files to server using JSP/Servlet? answer, bạn sẽ nhận được các thông số của bạn như FileItemisFormField() phương pháp trả true. Đăng đoạn mã có liên quan từ câu trả lời:

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) 
    } 
} 

Giải pháp: di chuyển thông số yêu cầu khác của bạn xử lý đến phần else khi gọi if (!item.isFormField()).

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

Cảm ơn bạn, hiện đang làm việc –

+0

@LovepreetSinghBatth vì bạn mới ở đây, vui lòng đánh dấu bài đăng này là câu trả lời bằng cách nhấp vào dấu kiểm bên dưới danh tiếng. –

3

Kể từ khi số multipart/form-data tạo thành cuộc gọi đến request.getParameter() sẽ luôn trả về giá trị rỗng. Trong trường hợp này, những gì bạn phải làm là

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 
} 

Tôi hy vọng mọi điều sẽ hoạt động tốt.

+0

Cảm ơn bạn, hiện đang làm việc –

+1

Bạn có thể chấp nhận và bỏ phiếu cho câu trả lời này nếu nó phù hợp với bạn. Nó sẽ giúp người dùng trong tương lai :). – kaysush

Các vấn đề liên quan