2010-05-13 3 views

Répondre

6

Pour commencer, pour sélectionner un fichier à télécharger en utilisant JSP vous avez besoin d'au moins un élément HTML <input type="file"> qui affichera un champ de navigation de fichier. Comme indiqué dans le HTML forms spec vous devez définir la méthode de demande à POST et le codage de la demande à multipart/form-data dans l'élément parent <form>.

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

Parce que le codage de la demande mentionnée ci-dessus est pas par défaut par les API Servlet avant Servlet 3.0 (que je ne pense pas que vous utilisez parce EJB 3.0 fait partie de Java EE 5.0 qui contient à son tour Servlet 2.5 seulement), vous ne verrez rien dans la carte des paramètres de la requête. Le request.getParameter("file") renverrait null.

Pour récupérer le fichier téléchargé et les autres paramètres de la requête dans un servlet, vous devez analyser le InputStream de vous HttpServletRequest. Heureusement, il existe une API couramment utilisée qui peut prendre le travail fastidieux de vos mains: Apache Commons FileUpload.

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
for (FileItem item : items) { 
    if (!item.isFormField()) { 
     // <input type="file"> 
     System.out.println("Field name: " + item.getFieldName()); 
     System.out.println("File name: " + item.getName()); 
     System.out.println("File size: " + item.getSize()); 
     System.out.println("File type: " + item.getContentType()); 
    } else { 
     // <input type="text|submit|hidden|password|button">, <select>, <textarea>, <button> 
     System.out.println("Field name: " + item.getFieldName()); 
     System.out.println("Field value: " + item.getString()); 
    }    
} 

Fondamentalement, vous avez juste besoin d'obtenir le InputStream de l'objet FileItem et écrire à tout OutputStream à votre goût en utilisant la manière Java IO habituelle.

InputStream content = item.getInputStream(); 

Sinon, vous pouvez également écrire directement:

item.write(new File("/uploads/filename.ext")); 

à leur page d'accueil, vous pouvez trouver beaucoup d'exemples et d'importants conseils & des astuces dans les sections User Guide et Frequently Asked Questions code. Lisez-les attentivement.

+0

Merci beaucoup pour vos suggestions! J'étudierai le Commons Fileload et je vais essayer de mettre en œuvre dans mon application, alors je serai de retour. Attention! George – George

+0

+1. J'ajouterais que vous devez ajouter '@SuppressWarnings (" unchecked ")' pour prendre soin de la première ligne de code, puisque 'parseRequest()' retourne juste 'List' –

+0

J'ai implémenté votre code mais il throws FileNotFound Exception – Roshan