2013-03-15 48 views
7

Tôi đang làm theo ví dụ được cung cấp trong trang tải lên tệp commons về API truyền trực tuyến. Tôi đang cố gắng tìm ra cách để có được phần mở rộng tập tin của tập tin được tải lên, làm thế nào để ghi tập tin vào một thư mục và phần tồi tệ nhất là nơi người viết các chú thích ví dụ // Process the input stream... Nó khiến tôi băn khoăn Tôi là người duy nhất không biết làm thế nào.cách tải lên tệp bằng cách sử dụng tải lên tệp commons trực tuyến api

+0

Có một lượng thông tin khổng lồ về cách thực hiện việc này tại đây: [link] (http://commons.apache.org/proper/commons-fileupload/using.html). – Sticks

Trả lời

8

Sử dụng này trong tập tin HTML của bạn:

<form action="UploadController" enctype="multipart/form-data" method="post"> 
    <input type="file"> 
</form> 

và trong UploadController servlet, bên trong doPost phương pháp:

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    if (isMultipart) { 
     FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 

    try { 
     List items = upload.parseRequest(request); 
     Iterator iterator = items.iterator(); 
     while (iterator.hasNext()) { 
      FileItem item = (FileItem) iterator.next(); 

      if (!item.isFormField()) { 
       String fileName = item.getName(); 

       String root = getServletContext().getRealPath("/"); 
       File path = new File(root + "/uploads"); 
       if (!path.exists()) { 
        boolean status = path.mkdirs(); 
       } 

       File uploadedFile = new File(path + "/" + fileName); 
       System.out.println(uploadedFile.getAbsolutePath()); 
       item.write(uploadedFile); 
      } 
     } 
    } catch (FileUploadException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

'boolean isMultipart = ServletFileUpload.isMultipartContent (yêu cầu); ServletFileUpload upload = ServletFileUpload mới(); FileItemIterator iter = upload.getItemIterator (yêu cầu); while (iter.hasNext()) { FileItemStream item = iter.next(); Tên chuỗi = item.getFieldName(); InputStream stream = item.openStream(); if (item.isFormField()) {} else { // Xử lý các input stream ... }} ' – qualebs

+0

rất xin lỗi vì sự định dạng mã nghèo. Tôi đang sử dụng thiết bị di động. bây giờ bạn xử lý luồng từ đoạn mã trên như thế nào? – qualebs

+4

Bạn có chắc chắn rằng bạn đang sử dụng API trực tuyến 'FileItem item = (FileItem) iterator.next();'? Tôi nghĩ rằng nó nên là 'FileItemStream item = iterator.next();' để bạn có thể sử dụng streaming. – Don

4

Đây là một Servlet mà những gì bạn muốn nó làm.

package rick; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.io.*; 
import org.apache.commons.fileupload.*; 
import org.apache.commons.fileupload.util.*; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import javax.servlet.annotation.WebServlet; 
@WebServlet("/upload4") 
public class UploadServlet4 extends HttpServlet{ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     PrintWriter out = response.getWriter(); 
     out.print("Request content length is " + request.getContentLength() + "<br/>"); 
     out.print("Request content type is " + request.getHeader("Content-Type") + "<br/>"); 
     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     if(isMultipart){ 
        ServletFileUpload upload = new ServletFileUpload(); 
      try{ 
       FileItemIterator iter = upload.getItemIterator(request); 
       FileItemStream item = null; 
       String name = ""; 
       InputStream stream = null; 
       while (iter.hasNext()){ 
            item = iter.next(); 
            name = item.getFieldName(); 
            stream = item.openStream(); 
        if(item.isFormField()){out.write("Form field " + name + ": " 
              + Streams.asString(stream) + "<br/>");} 
        else { 
         name = item.getName(); 
         System.out.println("name==" + name); 
         if(name != null && !"".equals(name)){ 
         String fileName = new File(item.getName()).getName(); 
         out.write("Client file: " + item.getName() + " <br/>with file name " 
                + fileName + " was uploaded.<br/>"); 
         File file = new File(getServletContext().getRealPath("/" + fileName)); 
         FileOutputStream fos = new FileOutputStream(file); 
         long fileSize = Streams.copy(stream, fos, true); 
         out.write("Size was " + fileSize + " bytes <br/>"); 
         out.write("File Path is " + file.getPath() + "<br/>"); 
         } 
        } 
       } 
      } catch(FileUploadException fue) {out.write("fue!!!!!!!!!");} 
     } 
    } 
} 
0

Có một 'thư viện' tuyệt vời để làm điều này cho bạn. Nó thực sự chỉ là một mẫu mã của một bộ lọc sẽ ngăn chặn bất kỳ bài viết hình thức của loại multipart và cung cấp cho bạn truy cập vào tập tin, tên tập tin vv ... mà bạn có thể xử lý trong phương pháp bài servlet bình thường của bạn.

http://balusc.blogspot.com/2007/11/multipartfilter.html

3

Vấn đề với tất cả các câu trả lời là nó không trả lời câu hỏi ban đầu !!

Khi thông báo "xử lý luồng đầu vào", nó thực sự làm bạn khó hiểu phải làm gì tiếp theo. Tôi đã nhìn vào câu hỏi này suốt đêm qua cố gắng tìm một gợi ý từ một trong những câu trả lời, nhưng không có gì. Tôi đã đi và thử các trang web khác, và không có gì.

Vấn đề là, những gì chúng tôi đang làm nằm ngoài phạm vi của Tệp tải lên và đó là vấn đề.

Chúng tôi hiện đang làm việc với Java.IO InputStream

InputStream stream = item.openStream(); 

bây giờ chúng tôi làm việc với điều đó "suối."

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=+writing+a+java+inputstream+to+a+file

Ở đây bạn có thể tìm thấy tất cả các loại câu trả lời cho những gì bạn cần. Nó khá ngớ ngẩn đến nỗi nó mơ hồ, và làm cho nó có vẻ như bạn phải làm một cái gì đó thêm với Commons, nhưng trong thực tế nó không phải commons InputStream đó là Java.io's!

Trong trường hợp của chúng tôi, chúng tôi mất con suối chúng ta đưa ra và tải lên một tập tin mới bằng cách đọc dữ liệu byte

Trang web này cũng có một loạt các tùy chọn mà có thể có ích http://www.jedi.be/blog/2009/04/10/java-servlets-and-large-large-file-uploads-enter-apache-fileupload/

Tôi hy vọng điều này sẽ giúp người khác những người đang nhầm lẫn và mới với FileUploading, bởi vì tôi chỉ tìm ra điều này trong vài phút trước khi viết câu trả lời này.

Đây là mã của tôi để lưu tệp vào ổ đĩa gốc.

try { 
      System.out.println("sdfk"); 

      boolean isMultipart = ServletFileUpload.isMultipartContent(request); 


// Create a new file upload handler 
      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(); 


        System.out.println("File field " + name + " with file name " 
          + item.getName() + " detected."); 
        // Process the input stream 
        File f = new File("/"+item.getName()); 

       System.out.println(f.getAbsolutePath()); 

       FileOutputStream fout= new FileOutputStream(f); 
       BufferedOutputStream bout= new BufferedOutputStream (fout); 
       BufferedInputStream bin= new BufferedInputStream(stream); 


       int byte_; 

       while ((byte_=bin.read()) != -1) 
       { 
        bout.write(byte_); 
       } 

       bout.close(); 
       bin.close(); 


      }  

     } 
     catch (FileUploadException ex) 
     { 
      Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     response.sendRedirect("/plans.jsp"); 

Chúc may mắn!

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