2013-03-15 14 views
7

Podążam za przykładem podanym na stronie przesyłania plików wspólnych. Utknąłem, próbując dowiedzieć się, jak uzyskać rozszerzenie pliku przesłanego pliku, jak napisać plik do katalogu, a najgorsze jest to, gdzie osoba, która napisała przykład, komentuje // Process the input stream.... Pozostaje mi zastanawiać się, czy to jest coś tak banalnego, że Jestem jedynym, który nie wie, jak to zrobić.jak przesłać plik za pomocą przesyłania plików w pliku commons

+0

Istnieje ogromna ilość informacji, jak to zrobić tutaj: [link] (http://commons.apache.org/proper/commons-fileupload/using.html). – Sticks

Odpowiedz

8

Użyj tego w pliku HTML:

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

aw UploadController serwletu wewnątrz metody doPost:

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 (request); ServletFileUpload upload = nowy ServletFileUpload(); FileItemIterator iter = upload.getItemIterator (żądanie); while (iter.hasNext()) { FileItemStream item = iter.next(); Nazwa ciągu = item.getFieldName(); Strumień InputStream = item.openStream(); if (item.isFormField()) { } else {// Przetwarzanie strumień wejściowy ... } } ' – qualebs

+0

więc przepraszam za słabą formatowania kodu. Jestem na urządzeniu mobilnym. jak przetworzyć strumień z powyższego fragmentu? – qualebs

+4

Czy jesteś pewien, że używasz strumieniowego API 'FileItem item = (FileItem) iterator.next();'? Myślę, że powinno to być 'FileItemStream item = iterator.next();' dzięki czemu można korzystać z przesyłania strumieniowego. – Don

4

Oto aplet, który robi to, co chcesz to zrobić.

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

Jest fantastyczna "biblioteka", która zrobi to za Ciebie. W rzeczywistości jest to tylko przykładowy kod filtru, który przechwyci dowolne posty z posta typu multipart i da ci dostęp do pliku, nazwy pliku itp ..., którą możesz obsłużyć w swojej normalnej metodzie postletu serwletu.

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

3

Problem z wszystkich tych odpowiedzi jest to, że nie odpowiada na pierwotne pytanie !!

Jak mówi "przetwarzanie strumienia wejściowego", naprawdę myli cię, co dalej. Przez całą noc patrzyłem na to pytanie, próbując znaleźć wskazówkę na podstawie jednej z odpowiedzi, ale nic. Poszedłem i wypróbowałem inne strony i nic.

Chodzi o to, że to, co robimy, wykracza poza zakres przesyłania pliku i to jest problem.

Obecnie pracujemy z java.io InputStream

InputStream stream = item.openStream(); 

teraz pracujemy z tym "strumieniem".

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

Tutaj można znaleźć wszystkie rodzaje odpowiedzi na to, co trzeba. To dość głupie, że jest tak niejasne i wydaje się, że musisz zrobić coś dodatkowego w Commons, ale w rzeczywistości to nie jest commons InputStream to Java.io!

W naszym przypadku bierzemy strumień nam dane i przesłać do nowego pliku, czytając bajt danych

Ta strona ma również kilka opcji, które mogą być przydatne http://www.jedi.be/blog/2009/04/10/java-servlets-and-large-large-file-uploads-enter-apache-fileupload/

Mam nadzieję, że to pomoże innym którzy są zdezorientowani i nowi w FileUploading, ponieważ właśnie to wymyśliłem kilka minut przed napisaniem tej odpowiedzi.

Oto mój kod, który zapisuje plik na dysku root.

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"); 

Powodzenia!

Powiązane problemy