Bonjour!
J'utilise FileUpload d'Apache pour charger un fichier dans ma base de données dans une architecture JSP / Servlet.
Tout fonctionne bien, sauf quand je veux uploader un fichier texte qui contient des accents... Ils sont tous remplacés par des charactères bizarres... Pour tout autre type de documents ou les autres champs de mon formulaire, je n'ai pas de problèmes...
Voici un extrait de mon code
Code:
request.setCharacterEncoding("UTF-8");
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
item = (FileItem) iter.next();
if (item.isFormField()) {
fieldName = item.getFieldName();
fieldValue = item.getString("UTF-8");
if (fieldName.equals("filePath")) {
filePath = fieldValue;
} else if (fieldName.equals("tableFk")) {
tableFk = Integer.parseInt(fieldValue);
} else if (fieldName.equals("name")) {
name = fieldValue;
} else if (fieldName.equals("description")) {
description = fieldValue;
} else if (fieldName.equals("keywords")) {
keywords = fieldValue;
} else if (fieldName.equals("lng")) {
lng = fieldValue;
}
} else {
fileItemToLoad = item;
fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
}
} // of while (iter.hasNext())
Il faut noter que j'ai besoin d'un array de bytes (byte[]), car c'est ce que je dois passer à mon composant qui va stoquer le fichier dans la base de données (le fichier n'est pas stoqué sur le file server).
J'ai aussi essayé avec un stream
Code:
request.setCharacterEncoding("UTF-8");
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
item = iter.next();
fieldName = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
fieldValue = Streams.asString(stream);
if (fieldName.equals("filePath")) {
filePath = fieldValue;
} else if (fieldName.equals("tableFk")) {
tableFk = Integer.parseInt(fieldValue);
} else if (fieldName.equals("name")) {
name = fieldValue;
} else if (fieldName.equals("description")) {
description = fieldValue;
} else if (fieldName.equals("keywords")) {
keywords = fieldValue;
} else if (fieldName.equals("lng")) {
lng = fieldValue;
}
} else {
fileItemToLoad = item;
String fileName = item.getName();
String contentType = item.getContentType();
int read = 0;
byte[] buffer = null;
file = null;
while (stream.read(buffer) != -1) {
System.arraycopy(buffer, 0, file, file.length, buffer.length);
buffer = null;
}
}
} // of while (iter.hasNext())
Mais le résultat est le même...
Dans le servlet qui restitue mon document texte, je récupère l'array de bytes et je l'affiche
Code:
// Character set
rq.setCharacterEncoding("UTF-8");
// Affichage du fichier
rs.setCharacterEncoding("UTF-8");
rs.setContentType( MIME );
rs.setContentLength(fileByteArray.length);
rs.setHeader("Content-Disposition","inline;filename=\"" + fileName + "\"");
rs.setHeader("cache-control", "max-age=30");
ServletOutputStream outs = rs.getOutputStream();
outs.write(fileByteArray, 0, fileByteArray.length);
outs.flush();
outs.close();
Est-ce que je fais quelque chose de faux?
S'il vous plaît, aidez moi, ça fait un moment que je coule...
Merci d'avance et bonne journée
Neil.