Bonjour,

Je développe une Api qui doit pouvoir gérer l'upload de fichier.
J'ai créer une jsp avec un petit formulaire pour renseigner les meta-données du document upload.

Mon upload fonctionne très bien.
J'utilise les librairies apache.commons.fileupload comme beaucoups de tutoriel préconise.

Mon problème se situe ici :

Si je récupère les paramètres de mon formulaire avant l'upload. L'upload n'a pas lieu.
Si je les récupère apres l'upload, je récupère des données "null".

Je pense que mon problème est lié a l'objet FileItem.
Notamment à la ligne :
List<FileItem> itemsSet = upload.parseRequest(request);

Ce que je ne comprend pas c'est en quoi récupérer des données via la méthode getParameters() empèche la suite du processus d'upload?




Je vous post mon code actuel de la Servlet :
(la partie insertion Mysql est en commentaire pour éviter d'upload du "null" à chaque fois.)

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
 
@WebServlet(name = "UploadFile", urlPatterns = "/UploadFile")
@Multipart
public class UploadFile extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	// ATTRIBUTES DE LA REQUETE
	private static final String ATTR_FILE = "file";
	private static final String ATTR_UPLOADS_DIRECTORY = "uploads-directory";
 
	private static final String VIEW1 = "/WEB-INF/web/upload.jsp";
	private static final String VIEW2 = "/WEB-INF/web/Ok.jsp";
	private static final String VIEW3 = "/WEB-INF/web/NonOk.jsp";
 
	private String uploadsdirectory = new String();
 
	// OBJET POUR LE CONTROL DE LA TAILLE DU FICHIER
	private static final int THRESHOLD_SIZE = 1024 * 1024 * 30; // 30MB
	private static final int MAX_FILE_SIZE = 1024 * 1024 * 500; // 500MB
	private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 500; // 500MB
 
	private AbstractDAO<Fichier> fichierDao;
 
 
	// POINT D'ENTRE AU SERVLET / LIKE A CONSTRUCTOR
	public void init() throws ServletException {
		// RECUPERATION DU CHEMAIN (REPERTOIRE) POUR LES FICHIERS TEMPORAIRES
		this.uploadsdirectory = this.getServletContext().getInitParameter(
				ATTR_UPLOADS_DIRECTORY);
 
		// VERIFICATION DE L EXISTENCE DU REPERTOIRE UPLOADS
		this.directoryCreator(this.uploadsdirectory);
 
		this.fichierDao = FactoryDAO.getFichierDAO();
	}
 
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
 
	this.getServletContext().getRequestDispatcher(VIEW1)
				.forward(request, response);
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
 
 
 
 
		if (new File(this.uploadsdirectory).exists()) {
 
			// OBJET METIER SET POUR UPLOADER UN FICHIER
			ServletFileUpload upload = null;
 
			AbstractFileUpload uploader = new PDFFileUpload(this.uploadsdirectory);
			AbstractFileUpload uploader2 = new UploadAnyFile(this.uploadsdirectory);
 
 
				String nomFichier = (String) request.getParameter("Nom");
				String auteurFichier = (String) request.getParameter("Auteur");
				String descriptionFichier = (String) request.getParameter("Description");
				String typeFichier = (String) request.getParameter("Type");
				System.out.println(nomFichier + auteurFichier+ descriptionFichier + typeFichier);
 
 
 
 
				if (ServletFileUpload.isMultipartContent(request)) {
					 try
					 {
 
// PRETRATITEMENT POUR CONTROLER LA TAILLER DU FICHIER
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(THRESHOLD_SIZE);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
upload = new ServletFileUpload(factory);
upload.setFileSizeMax(MAX_FILE_SIZE);
upload.setSizeMax(MAX_REQUEST_SIZE);
 
// OBTIEN LISTE DE ITEMS(INPUTs) DU FORMULAIRE ENVOYES PAR
// POST
List<FileItem> itemsSet = upload.parseRequest(request);
int itemsSetSize = itemsSet.size();
 
					for (int i = 0; i < itemsSetSize; i++) {
 
 
						if (!itemsSet.get(i).isFormField()) {
							uploader.upload(itemsSet.get(i)); // OBJET METIER
																// ENCHARGER
																// D'UPLOADER LE
																// FICHIER
 
							if (!uploader.getErrors().isEmpty()) {
								uploader.setErrors(null, null);
								uploader2.upload(itemsSet.get(i));
 
							}
						}
					}
 
					// AJOUT D'ATTRIBUTES A LA REQUETE
					request.setAttribute(ATTR_FILE, uploader);
 
					// REDIRECTION VERS LA VUE CORRESPONDANTE
					if (!uploader2.getErrors().isEmpty()) {
 
						this.getServletContext().getRequestDispatcher(VIEW3)
								.forward(request, response);
					} else {
 
						this.getServletContext().getRequestDispatcher(VIEW2)
								.forward(request, response);
					}
 
 
				// CREATION DUN OBJET FICHIER A PARTIR DES METADONNEES
					/*
					 * Fichier fichier=new Fichier();
					 * 
					 * fichier.setNom(nomFichier);
					 * fichier.setAuteur(auteurFichier);
					 * fichier.setDescription(descriptionFichier);
					 * fichier.setType(typeFichier);
					 * 
					 * fichier.setId(uploader.getFilecode());
					 * fichier.setSize(uploader.getFilesize());
					 * fichier.setFormat(uploader.getFileformat());
					 * 
					 * 
					 * fichier.setId(uploader2.getFilecode());
					 * fichier.setSize(uploader2.getFilesize());
					 * fichier.setFormat(uploader2.getFileformat());
					 * 
					 * 
					 * System.out.println(fichier.toString());
					 * this.fichierDao.create(fichier);
					 */
 
				}
			 catch (Exception e) {
				// ON PDFUPLOADER ERROR LIST
				uploader.setErrors("size","The selected file exceeds the size allowed by the server");
 
				// ON SERVER
				System.out.println(this.getClass().getName()
						+ ".multipart():\n" + e.getMessage());
			}
				}
 
		}
 
	}
 
	/** METHODE QUI GERE LA CREATION DE REPERTOIRES **/
	private void directoryCreator(String directoryname) {
		if (!new File(directoryname).exists()) {
			try {
				// CREATION DU REPERTOIRE
				new File(directoryname).mkdir();
			} catch (Exception e) {
				// REPPORTINF ERROR ON SERVER
				System.out.println(this.getClass().getName()
						+ ".directoryCreator():\n" + e.getMessage());
			}
		}
	}
 
}

Voila.
J'ai voulu utiliser la classe MultipartRequest mais cela ne correspond pas à ce que je veux faire ensuite et implique trop de changement.
Je le repète l'upload fonctionne très bien sans récupérer les paramètres du POST.



Merci,


Dastiny.