2010-04-07 4 views
3

le nom du fichier pour input type="file" (l'entrée sélectionnée dans la boîte de dialogue de fichier par l'utilisateur)Comment obtenir dans jsp

<script> 
    function OpenFileDialog(form) {  
     var a = document.getElementById("inputfile").click(); 
     SampleForm.filePath.value = //set the path here 
     document.SampleForm.submit(); 
    } 
</script> 

<form name="SampleForm" action="TestServlet" method="get"> 
    <input type="file" style="display:none;" id="inputfile"/> 
    <a href="javascript:OpenFileDialog(this.form);">Open here</a> 
    <input type="hidden" name="filePath" value=""/> 
</form> 

I Voulez-vous lire le chemin du fichier sélectionné dans ma classe de servlets? Comment obtenir le chemin du fichier? Puis-je le lire à partir de var a? Ou y a-t-il un moyen d'accéder directement au chemin du fichier depuis le input type="file" à partir de ma servlet?

Répondre

9

D'abord, pour effacer un malentendu commun: le chemin du fichier est sans valeur du côté du serveur. Imaginez que je suis le client et je vous donne le chemin du fichier , comment seriez-vous en tant que serveur obtenir son contenu? En utilisant java.io.File? Non? Cela ne fonctionnerait que si le client et le serveur s'exécutent physiquement sur la même machine . Le seulement l'occurrence possible est l'environnement de développement local. Deuxièmement, pour clarifier une restriction: Javascript ne peut rien faire avec un élément input type="file" en raison de restrictions de sécurité. Si c'était possible, alors on pourrait développer un site Web qui définit le fichier téléchargé à et soumet le formulaire au cours onload. C'est facile collecte de tous les fichiers de mot de passe de tous ceux qui visitent le site! Non?

Après tout, vous êtes plutôt intéressé par le fichier contenu. 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> 

De cette façon, le fichier sera envoyé dans le corps de la demande. Comme les versions standard de l'API Servlet jusqu'à 2.5 ne disposent pas des fonctionnalités intégrées pour analyser les requêtes mulipart/form-data, vous devez analyser la requête vous-même. Le meilleur moyen est d'utiliser Apache Commons FileUpload pour cela.Suivez le lien et lisez à la fois le Guide de l'utilisateur et Foire aux questions pour des exemples de code et des conseils & astuces. Lorsque vous êtes déjà sur Servlet 3.0, vous pouvez simplement utiliser l'API Servlet fournie HttpServletRequest#getParts() pour cela. You can find here an article with code examples about that.

+0

Merci BalusC pour votre explication détaillée .. :) Je suis nouveau à cela et donc ne pas comprendre les implications de l'accès au chemin du fichier ... je suppose que je dois utiliser Servlet jusqu'à la version 2.5 et je le ferai suivez l'approche que vous avez mentionnée pour lire le contenu du fichier ... Merci encore une fois !! – deepthinker121

+0

Non, il n'y a aucune restriction dans la version de servlet. Jusqu'à la version 2.5, il n'y a pas de moyen intégré pour faciliter l'analyse des fichiers téléchargés. Vous devez alors récupérer Apache Commons FileUpload. Mais si vous utilisez déjà la nouvelle version 3.0, vous pouvez utiliser des méthodes intégrées pour analyser les fichiers téléchargés. – BalusC

+0

ok, got it .. Je veux aussi effectuer l'opération inverse - télécharger un fichier à partir du serveur - voulez une boîte de dialogue de fichier à ouvrir pour sélectionner l'emplacement de téléchargement ... comment cela peut-il être fait? – deepthinker121

0

(Tiré http://www.jguru.com/faq/view.jsp?EID=1045507)

Solution A:

  1. Télécharger http://www.servlets.com/cos/index.html
  2. Vérifiez http://www.servlets.com/cos/javadoc/com/oreilly/servlet/MultipartRequest.html - il a le getter pertinent.

Solution B:

  1. télécharger http://commons.apache.org/fileupload/
  2. invoquez readHeaders() dans org.apache.commons.fileupload.MultipartStream

Solution C:

  1. télécharger http://users.boone.net/wbrameld/multipartformdata/
  2. Invoke getParameter sur com.bigfoot.bugar.servlet.http.MultipartFormData
Questions connexes