2013-03-15 5 views
7

Je suis l'exemple fourni sur le site de téléchargement de fichiers communs sur l'API de streaming. Je suis coincé essayant de comprendre comment obtenir l'extension de fichier du fichier téléchargé, comment écrire le fichier dans un répertoire et le pire est où la personne qui a écrit l'exemple commente // Process the input stream... Il me laisse me demander si c'est quelque chose d'aussi trivial que Je suis le seul qui ne sait pas comment.Comment télécharger un fichier en utilisant le téléchargement de fichiers communs streaming streaming api

+0

Il y a énormément d'informations sur la façon de procéder ici: [link] (http://commons.apache.org/proper/commons-fileupload/using.html). – Sticks

Répondre

8

Utilisez dans votre fichier HTML:

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

et dans le servlet UploadController, dans la méthode 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 (requête); ServletFileUpload upload = new ServletFileUpload(); FileItemIterator iter = upload.getItemIterator (requête); While (iter.hasNext()) { FileItemStream item = iter.next(); Nom de la chaîne = item.getFieldName(); Flux InputStream = item.openStream(); si (item.isFormField()) { } else {// traiter le flux d'entrée ... }} ' – qualebs

+0

désolé pour le formatage du code pauvres. Je suis sur un appareil mobile. Maintenant, comment traitez-vous le flux de l'extrait ci-dessus? – qualebs

+4

Etes-vous sûr d'utiliser l'API de diffusion de fichiers 'FileItem item = (FileItem) iterator.next();'? Je pense qu'il devrait être 'FileItemStream item = iterator.next();' de sorte que vous puissiez utiliser le streaming. – Don

4

Voici une Servlet qui fait ce que vous voulez qu'il fasse.

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

Il y a une 'bibliothèque' fantastique pour le faire pour vous. C'est en fait juste un échantillon de code d'un filtre qui interceptera tous les messages de formulaire de type multipart et vous donnera accès au fichier, au nom de fichier etc ... que vous pouvez gérer dans votre méthode de poste de servlet normale.

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

3

Le problème avec toutes ces réponses est qu'il ne répond pas à la question initiale !! Comme il est dit "traiter le flux d'entrée", cela vous rend vraiment confus. Je regardais cette question toute la nuit dernière essayant de trouver un indice à partir de l'une des réponses, mais rien. Je suis allé et essayé d'autres sites, et rien. En fait, ce que nous faisons est en dehors de la portée de File Upload, et c'est le problème.

Nous travaillons maintenant avec Java.IO InputStream

InputStream stream = item.openStream(); 

maintenant nous travaillons avec ce "cours d'eau".

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

Ici vous pouvez trouver toutes sortes de réponses à ce que vous avez besoin. C'est assez bête que ce soit si vague, et donne l'impression que vous devez faire quelque chose de plus avec Commons, mais en réalité ce n'est pas CommonsStream c'est Java.io!

Dans notre cas, nous prenons le courant nous donne et télécharger un nouveau fichier en lisant les données octet

Ce site a aussi un tas d'options qui pourraient être utiles http://www.jedi.be/blog/2009/04/10/java-servlets-and-large-large-file-uploads-enter-apache-fileupload/

J'espère que cela aide les autres qui sont confus et nouveau à FileUploading, parce que je viens de comprendre cela quelques minutes avant d'écrire cette réponse.

Voici mon code qui enregistre un fichier sur le lecteur racine.

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

Bonne chance!

Questions connexes