Bonjour,

j'essaye de mettre en place un upload de fichiers sur struts 2, malheureusement la variable File est null en sortie. Voici certains des fichiers que j'utilise:

struts.xml

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
 
    <package name="exemple16" namespace="/" extends="struts-default">
        <default-action-ref name="Lister_Client" />
 
        <action name="Lister_Client" class="exemple16.ClientAction" method="lister">
            <result>/jsp/ListerClient.jsp</result>
        </action>
 
        <action name="Ajouter_Client" class="exemple16.ClientAction" method="ajouter">
        	<interceptor-ref name="fileUpload">
        		<param name="maximumSize">102400</param>
            	<param name="allowedTypes">image/gif,image/jpeg,image/png</param>
            </interceptor-ref> 	
   			<interceptor-ref name="basicStack"/>
            <result name="success" type="redirectAction">Lister_Client</result>
        </action>
    </package>
</struts>
ClientAction.java

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package exemple16;
 
import java.io.File;
import java.util.List;
 
import javax.servlet.ServletContext;
 
import org.apache.struts2.ServletActionContext;
 
import com.opensymphony.xwork2.ActionSupport;
import exemple16.javabeans.Client;
import exemple16.modele.ClientModele;
 
 
@SuppressWarnings("serial")
public class ClientAction extends ActionSupport {
 
    private Client client;
    private List<Client> listeClients;
    private File image;
    private String imageFileName;
    private String imageContentType;
 
 
 
	public File getImage() {
		return image;
	}
 
	public void setImage(File image) {
		this.image = image;
	}
 
	public String getImageFileName() {
		return imageFileName;
	}
 
	public void setImageFileName(String imageFileName) {
		this.imageFileName = imageFileName;
	}
 
	public String getImageContentType() {
		return imageContentType;
	}
 
	public void setImageContentType(String imageContentType) {
		this.imageContentType = imageContentType;
	}
 
	public Client getClient() {
		return client;
	}
 
	public void setClient(Client client) {
		this.client = client;
	}
 
	public List<Client> getListeClients() {
		listeClients=ClientModele.getListeClients();
		return listeClients;
	}
 
	public void setListeClients(List<Client> listeClients) {
		this.listeClients = listeClients;
	}
 
	// retourner la liste des clients après récupération
	public String lister() 
	{
		listeClients=ClientModele.getListeClients();
        return SUCCESS;
    }
 
 
	// ajouter le client dans le modèle
	public String ajouter() throws Exception
	{
		// placer le nom du fichier dans le client
		if(this.imageFileName!=null)
		{		
			client.setImage(this.imageFileName);
			// copier le fichier dans le répertoire de l'application imagesclients
			ServletContext context=ServletActionContext.getServletContext();
			String repertoireImagesClient=context.getRealPath("imagesclients");
			File sauvegardeImage=new File(repertoireImagesClient,this.imageFileName);
			this.image.renameTo(sauvegardeImage);
			ClientModele.ajouter(this.client);
		}
 
 
	    return SUCCESS;
	}
 
}
ListerClient.jsp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Liste des clients</title>
<style type="text/css">@import url(css/styles.css);</style>
</head>
<body>
<!-- Message d'erreur -->
<s:if test="errors.size()>0">
<div id="message_erreur">
	<label>Les erreurs suivantes se sont produites : </label>
	<ul><s:fielderror/></ul>
</div>
</s:if>
<!-- Message d'erreur lors des actions -->
<s:if test="errorMessages.size()>0">
<div id="message_erreur">
	<label>Les erreurs d'action suivantes se sont produites : </label>
	<ul><s:actionerror/></ul>
</div>
</s:if>
<!-- Message de succès -->
<s:if test="actionMessages.size()>0">
	<div id="message_information">
		<ul><s:actionmessage/></ul>
	</div>
</s:if>
 
<div id="enveloppe">									
	<h3>Ajouter un client</h3>
	<s:form method="post" action="Ajouter_Client" enctype="multipart/form-data">
		<s:textfield name="client.identifiant" id="client.identifiant" label="Identifiant" labelposition="top" cssClass="input"/>
		<s:textfield name="client.motdepasse" id="client.motdepasse" label="Mot de passe" labelposition="top" cssClass="input"/>
		<s:file name="image" id="image" label="Image" labelposition="top" cssClass="input"/>
		<s:submit value="Ajouter un client"/>
	</s:form>
 
	<table border="0" id="tableau" cellpadding="0" cellspacing="0">
	<tr><td><b>ID</b></td><td><b>Identifiant</b></td><td><b>Mot de passe</b></td><td><b>Image</b></td></tr>
	<s:iterator value="listeClients" status="ligne">
	<s:if test="#ligne.odd"><tr class="ligne1"></s:if>
	<s:if test="#ligne.even"><tr class="ligne2"></s:if>
    	<td><s:property value="idClient"/></td>
    	<td><s:property value="identifiant"/></td>
    	<td><s:property value="motdepasse"/></td>
    	<s:if test="image!=null">
    		<td><img src="imagesclients/${image}" width="40" height="40"/></td>
    	</s:if>
    	<s:else>
    		<td>&nbsp;</td>
    	</s:else>
  	</tr>
	</s:iterator>
	</table>	
 
</div>
</body>
</html>
Je me suis aperçu que dans ClientAction.java la variable imageFileName était à null.

Hors sur un post que j'ai trouvé sur un forum, la personne avait ceci comme problème:

In my struts2 application I am using “File Upload Interceptor”. Its running well but after uploading when same jsp page appears it does not show browsed file name in the textbox of <s:file> tag i.e textbox comes empty after successful uploading.
Voici la réponse:

This is not a problem of Struts. For security reasons modern browser don't allow to set a value for file upload fields. If you want to display the file name after the upload you'll have to use simple text.
Je suppose que j'ai le même problème, j'aurais souhaité savoir, comment je pouvais contourner le problème pour mon exemple, si cela était possible.

Merci d'avance pour votre réponse.

Mumu27