L'exemple de cet article décrit comment implémenter la fonction de téléchargement et de téléchargement de fichiers dans struts2 en Java. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
1.Téléchargement de fichiers
Le premier est le code de la page jsp
Définir une balise de téléchargement dans la page jsp
Copiez le code comme suit :<tr>
<td align="right" bgcolor="#F5F8F9"><b>Pièce jointe :</b></td>
<td bgcolor="#FFFFFF">
<input type="file" name="upload" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Ensuite, les attributs associés définis dans BaseAction sont omis (vous pouvez également les définir dans votre propre action, modifiez simplement le modificateur d'accès)
Copiez le code comme suit :/**
*Classe de base d'action
**/
la classe publique BaseAction étend ActionSupport {
téléchargement de liste<Fichier> protégé ;
protected List<String> uploadContentType; //Type de fichier
protected List<String> uploadFileName; //Nom du fichier
chaîne protégée savePath ; //enregistre le chemin
}
Ensuite il y a une méthode de téléchargement dans Action, le code est le suivant :
Copiez le code comme suit :/**
* 8. Télécharger les pièces jointes * @param upload
*/
public void uploadAccess(List<File> upload){
essayer {
if (null != télécharger) {
pour (int i = 0; i < upload.size(); i++) {
Chemin de chaîne = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(chemin);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = new FileOutputStream(chemin);
FileInputStream fis = new FileInputStream(getUpload().get(i));
octet[] tampon = nouvel octet[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
}
} attraper (Exception e) {
logger.error("Erreur lors du téléchargement de la pièce jointe.", e);
}
}
Ensuite, le code de copie de mon fichier struts2.xml est le suivant : <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd. ms-excel
</param>
<param name="fileUpload.maximumSize">8 000 000</param>
</intercepteur-réf>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</action>
savePath est le chemin de sauvegarde, fileUpload.allowedTypes est utilisé pour limiter la limite de taille du fichier de type de fichier de téléchargement fileUpload.maximumSize
2.Téléchargement du fichier
Tout d’abord, copiez le code du lien de téléchargement sur la page comme suit : <tr>
<td align="right" bgcolor="#F5F8F9"><b>Pièce jointe :</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory}</div>
<c:if test="${!empty item.accessory}">
<div style="float: left;"><a style="color: black; text-decoration: none;" /div>
</c:si>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Voici ensuite le code pour DownloadAction :
Copiez le code comme suit :/**
* TéléchargerAction
*
* @auteur zhaoxz
*
*/
@Controller("downloadAction")
@Scope("prototype")
la classe publique DownloadAction étend BaseAction {
/**
*
*/
privé statique final long serialVersionUID = -4278687717124480968L;
enregistreur statique privé logger = Logger.getLogger (DownloadAction.class);
nom de fichier de chaîne privé ;
inputStream privé inputStream ;
chaîne privée savePath ;
chaîne privée mimeType ;
public InputStream getInputStream() {
essayer {
Chemin de chaîne = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(chemin);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = nouveau FileInputStream(chemin);
Agent de chaîne = request.getHeader("USER-AGENT");
System.out.println(agent);
si (null != agent) {
if (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} autre {// IE7+ Chrome
System.out.println("IE,Chrome");
nom de fichier = new String(nom de fichier.getBytes("ISO8859-1"),"utf-8");
nom de fichier = java.net.URLEncoder.encode(nom de fichier, "UTF-8");
}
}
} attraper (Exception e) {
logger.error("Erreur lors du téléchargement des informations sur le fichier.", e);
}
si (null == inputStream) {
System.out.println("erreur getResource");
}
retourner inputStream ;
}
public void setInputStream (InputStream inputStream) {
this.inputStream = inputStream ;
}
@Outrepasser
public Stringexecute() lève une exception {
retourner le SUCCÈS ;
}
/****************************** préparez-vous **************** ******* **********/
chaîne publique getSavePath() {
renvoie this.savePath ;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
chaîne publique getFilename() {
renvoie le nom du fichier ;
}
public void setFilename (String nom de fichier) {
this.filename = nom de fichier ;
}
}
Ensuite, il y a son fichier struts2.xml :
Copiez le code comme suit : <action name="download">
<param name="savePath">E:/upload</param>
<result type="flux">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</résultat>
</action>
Lors du téléchargement, faites attention au format d’encodage et il ne devrait y avoir aucun problème.
Problèmes rencontrés lors du téléchargement
1. Une erreur se produit lors du téléchargement de fichiers volumineux.
Les erreurs qui se produisent sont les suivantes :
1. 2012-02-24 11:06:31,937 ERREUR (org.apache.struts2.dispatcher.Dispatcher:512) - Impossible de trouver l'action ou le résultat
Aucun résultat défini pour l'action com.iman.portal.action.QuestionActionImpl et le résultat problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51 : 55
2. la demande a été rejetée car sa taille (2973652) dépasse le maximum configuré (2097152)
Signification chinoise : La demande a été rejetée car sa taille (2973652) dépasse le maximum configuré (2097152),
Compte tenu de l’expérience utilisateur, il est nécessaire d’intercepter ces exceptions lors du téléchargement de pièces jointes. La solution est la suivante :
1. Les fichiers téléchargés sont d'abord stockés dans le cache pendant le processus de téléchargement. Pour des raisons de sécurité, ajoutez un chemin de stockage temporaire au fichier struts.properties du projet, bien que le chemin physique du serveur ait été défini dans le projet.
Copiez le code comme suit : struts.multipart.saveDir=/temp
2. Étant donné que la taille du fichier téléchargé peut être modifiée ultérieurement, qu'il s'agisse de la taille par défaut ou non, ajoutez la configuration suivante au fichier struts.properties du projet :
Copiez le code comme suit : <!-- La taille autorisée du fichier de téléchargement est de 2 Mo -->
<constant name="struts.multipart.maxSize" value="2097152"/>
3. configuration struts.xml
Copiez le code comme suit : <!-- Comment modifier le problème -->
<action name="updateProblem" méthode="updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</action>
4. L'étape la plus importante et la plus critique
L'intercepteur fileUpload ne détermine le type et la taille du fichier qu'une fois le fichier téléchargé sur le serveur. Si nous ne faisons rien dans Action, l'exception sera affichée devant l'utilisateur, j'ai donc pensé à un moyen de définir les informations d'exception sous forme de message d'erreur au niveau de l'action. Autrement dit, remplacez la méthode addActionError.
Copiez le code comme suit : @Override
public void addActionError (String anErrorMessage) {
// Ici, nous devons d'abord déterminer s'il s'agit d'une erreur que nous souhaitons remplacer avant de la traiter.
if (anErrorMessage.startsWith("la requête a été rejetée en raison de sa taille")) {
Modèle modèle = Pattern.compile("d+");
Matcher m = motif.matcher(anErrorMessage);
// Correspond une fois
m.find();
String s1 =m.group();//Taille du fichier téléchargé
// Correspond à nouveau
m.find();
Chaîne s2 =m.group();//taille limitée
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="La taille du fichier que vous avez téléchargé (" + Long.valueOf(s1)/1024 + "bytes) dépasse la taille autorisée (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","Le fichier est trop volumineux et dépasse la taille autorisée ("+Long.valueOf(s2)/1024/1024+"M). Le téléchargement a échoué !");
// Remplace les informations
super.addActionError(fileUploadErrorMessage);
}
} else {// Sinon, gérez-le selon la méthode d'origine
super.addActionError(anErrorMessage);
}
}
Oui, utilisez <s:fielderror/> <s:fielderror/> sur la page de retour pour obtenir le contenu de l'erreur dans addActionError.
Parce que je ne souhaite pas afficher la cause de l'erreur sur la page et que je souhaite afficher une boîte de dialogue, je mets les informations dans l'objet de requête.
Lorsque la page est chargée, la vérification js suivante est ajoutée :
Copiez le code comme suit : // Déterminez si le fichier est téléchargé avec succès
var message="${request.fileUploadErrorMessage}";
if(message!=null && ""!=trim(message) && message!="null"){
self.parent.diag.close();
alerte (message);
retour;
}
Voici quelques références pour comprendre Dongdong :
struts.multipart.maxSize contrôle la taille maximale des fichiers téléchargés par l'ensemble du projet
Les attributs maximumSize des intercepteurs struts.multipart.maxSize et fileUpload ont différentes divisions de travail, qui sont résumées comme suit :
1.struts.multipart.maxSize contrôle la taille maximale des fichiers téléchargés dans l'ensemble du projet.
Si cette taille est dépassée, une erreur sera signalée en arrière-plan et le programme ne pourra pas gérer un fichier aussi volumineux. L'invite suivante s'affichera dans fielderror :
la demande a été rejetée car sa taille (16272982) dépasse le maximum configuré (9000000)
2. L'attribut maximumSize de l'intercepteur fileUpload doit être inférieur à la valeur de struts.multipart.maxSize.
La valeur par défaut de struts.multipart.maxSize est 2M. Lorsque maximumSize est supérieure à 2M, la valeur de struts.multipart.maxSize doit être supérieure à maximumSize.
3. Lorsque le fichier téléchargé est plus grand que struts.multipart.maxSize, le système signale une erreur. Lorsque le fichier téléchargé est compris entre struts.multipart.maxSize et maximumSize, le système demande :
Fichier trop volumineux : fichier "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Lorsque le fichier téléchargé est plus petit que maximumSize, le téléchargement réussit.
Copiez le code comme suit : <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/données</param>
<param name="maximumSize">52428800</param>
</intercepteur-réf>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
Une erreur se produit lors du téléchargement de fichiers volumineux. Solution 2 :
Problème : Erreur lors du téléchargement de fichiers volumineux...
Solution : Modifiez les paramètres dans le fichier struts.xml comme suit. Copiez le code comme suit : <constant name="struts.multipart.maxSize" value="55000000"/>.
<action name="UploadFile">
<result name="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/données</param>
<param name="maximumSize">52428800</param>
</intercepteur-réf>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
La relation entre la taille du fichier struts.xml et la taille réelle du fichier : 1048576 (octets) = 1024*1024 = 1 Mo de taille réelle du fichier.
struts.multipart.maxSize contrôle la taille maximale des fichiers téléchargés par l'ensemble du projet
Les attributs maximumSize des intercepteurs struts.multipart.maxSize et fileUpload ont différentes divisions de travail, qui sont résumées comme suit :
1.struts.multipart.maxSize contrôle la taille maximale des fichiers téléchargés dans l'ensemble du projet. Si cette taille est dépassée, une erreur sera signalée en arrière-plan et le programme ne pourra pas gérer un fichier aussi volumineux. L'invite suivante s'affichera dans fielderror :
la demande a été rejetée car sa taille (16272982) dépasse le maximum configuré (9000000)
2. L'attribut maximumSize de l'intercepteur fileUpload doit être inférieur à la valeur de struts.multipart.maxSize.
La valeur par défaut de struts.multipart.maxSize est 2M. Lorsque maximumSize est supérieure à 2M, la valeur de struts.multipart.maxSize doit être supérieure à maximumSize.
3. Lorsque le fichier téléchargé est plus grand que struts.multipart.maxSize, le système signale une erreur. Lorsque le fichier téléchargé est compris entre struts.multipart.maxSize et maximumSize, le système demande :
Fichier trop volumineux : fichier "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Lorsque le fichier téléchargé est plus petit que maximumSize, le téléchargement réussit.
Restrictions relatives aux types de fichiers de téléchargement
Configurer l'intercepteur de téléchargement de fichiers
Le defaultStack de struts2 contient déjà l'intercepteur fileupload. Si vous souhaitez ajouter le paramètre AllowTypes, vous devez écrire un nouveau defaultstack, le copier et le modifier :
Copiez le code comme suit : <intercepteurs>
<nom de la pile d'intercepteurs="myDefaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name=www.VeVB.COm/>
<interceptor-ref name="chain"/>
<interceptor-ref name="débogage"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/png,image/gif,image/jpeg
</param>
</intercepteur-réf>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^entretoises..*</param>
</intercepteur-réf>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">saisie,retour,annulation,parcourir</param>
</intercepteur-réf>
<interceptor-ref name="workflow">
<param name="excludeMethods">saisie,retour,annulation,parcourir</param>
</intercepteur-réf>
</pile-intercepteur>
</intercepteurs>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
Modifiez uniquement le code copié dans le code comme suit : <interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/png,image/gif,image/jpeg
</param>
</intercepteur-réf>
La pile d'intercepteurs est configurée à l'intérieur de la balise <package> et à l'extérieur de la balise <action> comme ci-dessus. Si nous la définissons comme intercepteur par défaut, nous n'avons pas besoin de le faire.
Introduisez-le dans la balise <action>. Sinon, vous devez introduire un intercepteur. Copiez le code : <action>.
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</action>
L'action d'erreur de type de téléchargement de fichier renverra directement l'entrée, il n'est donc pas nécessaire de renvoyer « entrée » dans l'action ;
Vous pouvez également définir le chemin et la taille de votre requête de téléchargement en dehors de la balise <package> :
Copiez le code comme suit : <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
Le point le plus important : le formulaire de téléchargement des fichiers doit ajouter : enctype="multipart/form-data". Dans le cas contraire, une erreur de saisie sera signalée.
J'espère que cet article sera utile à la programmation Java de chacun.