2012-12-26 70 views
6

Tôi sử dụng chú thích Servlet 3 @MultiPartConfig để triển khai tải tệp lên trong ứng dụng của mình. Tôi cần thiết lập thông số vị trí multipart-config tại thời gian chạy (không phải hardcode trong tham số chú thích). Có API nào cho truy cập có lập trình vào multipart-config của servlet không?Truy cập có lập trình vào MultiPartConfig trong Servlet 3.0

Cảm ơn

Trả lời

5

@MultiPartConfig thực sự chỉ là giao diện đánh dấu cho vùng chứa. Khi servlet được khởi tạo, các giá trị chú thích được cung cấp được ánh xạ tới nó với một đối tượng proxy. Khi yêu cầu đến là dữ liệu nhiều phần/biểu mẫu, các phần của video tải lên được ánh xạ tới yêu cầu và vùng chứa thực hiện công việc cần thiết dựa trên các giá trị từ chú thích và các phần theo yêu cầu. Không có cách nào để bạn có thể ngăn chặn quá trình này vì nó xảy ra bên trong ruột của container. Tuy nhiên, có một thay thế. Nó yêu cầu thực hiện một hoạt động hệ thống tập tin lần thứ hai. Vì bạn có tất cả các phần, bạn có thể tái tạo lại tệp và "tải lên lại" lên vị trí bạn chọn. Nó có thể trông giống như phương pháp bên dưới. Hãy nhớ mặc dù tôi đã thử nghiệm này một cách nhanh chóng trong một servlet của riêng tôi để chứng minh khái niệm nó là rõ ràng là không hoàn thành mã:

@Override 
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
     throws ServletException, IOException { 

    httpServletResponse.setContentType("text/html"); 
    PrintWriter printWriter = httpServletResponse.getWriter(); 

    InputStream inputStream; 
    FileOutputStream fileOutputStream; 

    for (Part part : httpServletRequest.getParts()) { 

     inputStream = httpServletRequest.getPart(part.getName()).getInputStream(); 
     int i = inputStream.available(); 
     byte[] b = new byte[i]; 
     inputStream.read(b); 
     String fileName = ""; 

     for (String temp : part.getHeader("content-disposition").split(";")) { 
      if (temp.trim().startsWith("filename")) { 
       fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", ""); 
      } 
     } 

     String uploadDir = "/temp"; 
     fileOutputStream = new FileOutputStream(uploadDir + "/" + fileName); 
     fileOutputStream.write(b); 
     inputStream.close(); 
     fileOutputStream.close(); 

     printWriter.write("Uploaded file " + uploadDir + "/" + fileName + "."); 
    } 
} 
+0

Nếu bạn đang sử dụng @MultiPartConfig và cần một vị trí file runtime sau đó bạn không có tùy chọn nào khác ngoài "tải lên lại" các bộ phận. –

0

tôi đã cùng một vấn đề của bạn quá và giải pháp rất đơn giản: chuẩn Servlet 3.0 tập tin tải lên không đủ: chỉ cần lấy lọ từ Apache FileUpload Commons và bạn đã hoàn tất

chỉ cần nhìn vào tinh thể này ví dụ rõ ràng với streaming API

ServletFileUpload upload = new ServletFileUpload(); 

    // Parse the request 
    FileItemIterator iter = upload.getItemIterator(request); 
    while (iter.hasNext()) { 
     FileItemStream item = iter.next(); 
     String name = item.getFieldName(); 
     InputStream stream = item.openStream(); 
     if (item.isFormField() == false) 
      System.out.println("File field " + name + " with file name " 
      + item.getName() + " detected."); 
      FileOutputStream fos = new FileOutputStream("your_location"); 
      Streams.copy (stream, fos, true); 

     } 
    } 
+0

Câu hỏi là về @MultiPartConfig và tải lên tệp mà bạn không giải quyết. Bạn cũng đang phát trực tuyến từ một mục đã có trên yêu cầu (được tải lên trong bộ nhớ) và điều đó có nghĩa là bạn chỉ cần đọc lại nó "tải lên lại". –

+0

@Brian Reindel đó không phải là trường hợp, tôi không 'tải lại' một lần nữa, với Streaming API những gì tôi làm là một phân tích cú pháp trực tiếp của yêu cầu không có tập tin tạm thời hoặc bộ nhớ đệm trong bộ nhớ. Thực tế đó là lợi thế với Streaming API: Bộ nhớ hiệu quả và xử lý nhanh hơn, vui lòng kiểm tra http://commons.apache.org/proper/commons-fileupload/streaming.html –

+0

Giả sử bạn đang ở trong Servlet và sử dụng vùng chứa, mục tệp nhận được như thế nào theo yêu cầu? Các byte đã được nạp trong bộ nhớ. Bạn đang không phát nội dung trong thời gian thực trong khi chúng đang được tải lên. Bạn chính xác rằng lợi thế của cách tiếp cận của bạn trên FileUpload là bởi vì trong trường hợp đó tệp đầu tiên phải được ghi vào hệ thống tệp. Tôi không đồng ý rằng phải quản lý hai tập tin trên đĩa là có vấn đề. Tuy nhiên, câu hỏi đã giải quyết cụ thể chú thích @MultiPartConfig và vị trí thời gian chạy của tệp và không chỉ đơn giản là tải lên tệp nói chung. –

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