2011-02-16 17 views
14

Estoy usando las herramientas Apache Commons Fileupload para cargar archivos estándar. Mi problema es que no puedo obtener el nombre de archivo correcto de los archivos cargados si contienen caracteres especiales (á, é, ú, etc.) ¿Todos se convierten a? señales.file de servlet cargar la codificación del nombre de archivo

request.getCharacterEncoding() dice UTF-8, pero los bytes que obtengo en la cadena fileItem.getName() son todos iguales para todos mis caracteres especiales.

¿Me puede ayudar lo que está mal?

(Algunos detalles: el uso de Firefox 3.6.12, Weblogic 10.3 en Windows)

Esta es mi fragmento de código:

public CommandMsg(HttpServletRequest request) { 
    Enumeration names = null; 
    if (isMultipart(request)) { 
     FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     try { 
     List uploadedItems = upload.parseRequest(request); 
     Iterator i = uploadedItems.iterator(); 
     FileItem fileItem = null; 
     while (i.hasNext()) { 
      fileItem = (FileItem) i.next(); 
      if (fileItem.isFormField()) { 
      // System.out.println("isFormField"); 
      setAttribute(fileItem.getFieldName(), fileItem.getString()); 
      } else { 
      String enc = "utf-8"; 
      enc = request.getCharacterEncoding(); 
      String fileName = fileItem.getName(); 
      byte[] fnb = fileItem.getName().getBytes(); 
      byte[] fnb2 = null; 
      try { 
       fnb2 = fileItem.getName().getBytes(enc); 
       String t1 = new String(fnb); 
       String t2 = new String(fnb2); 
       String t3 = new String(fnb, enc); 
       String t4 = new String(fnb2, enc); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      setAttribute(fileItem.getFieldName(), fileItem); 
      } 
     } 
     } catch (FileUploadException ex) { 
     ex.printStackTrace(); 
     } 

// etc.. 
+0

¿Ha intentado para obtener el nombre de archivo con y sin decodificar el nombre del archivo? Es un poco extraño que haya tal problema en una biblioteca ampliamente utilizada. – gigadot

+0

sí, como puede ver, el primer intento es: "String fileName = fileItem.getName();" cual es malo. Todas las demás líneas (t1..4) son solo intentos desesperados ... :-) – jabal

Respuesta

11

Tuve el mismo problema y lo resolví así.

ServletFileUpload upload = new ServletFileUpload(factory); 
upload.setHeaderEncoding("UTF-8"); 

FileItemIterator iter = upload.getItemIterator(request); 
while (iter.hasNext()) { 
    FileItemStream item = iter.next(); 
    String name = item.getFieldName(); 
    InputStream stream = item.openStream(); 
    if (item.isFormField()) { 
     String value = Streams.asString(stream, "UTF-8"); 
    } 
} 

Si usted según su código en el ejemplo proporcionado en http://commons.apache.org/fileupload/streaming.html entonces usted necesita para asegurarse de que se establece UTF-8 en dos lugares por encima.

+0

Christoph Usted hizo mi día es una pena tener que escribir dicho código repetitivo pero funciona así:. Paso medio día buscando en la parte html mientras el "problema" estaba en el lado del servidor ...;) –

+3

No necesita manejar explícitamente la transmisión, solo puede usar 'FileItem # getString (String)', donde sp ecifique la codificación como, por ej. "UTF-8": 'item.getString (" UTF-8 ")'. – Svante

3

Usted necesita asegurarse de que la consola de destino/archivo/base de datos/lo que sea donde está imprimiendo/escribiendo/insertando el nombre del archivo para que también sea compatible con UTF-8. Los signos de interrogación indican que no está configurado para aceptar UTF-8 y que el propio objetivo es consciente de eso. De lo contrario, solo habría visto mojibake.

Desde el detalle sobre el destino no se encuentra en la pregunta, no puedo hacer mucho más de lo que sugiere que se consigue a través this article para entender lo que está pasando con los personajes detrás de las escenas.

+0

tiene razón, no proporcioné información sobre el objetivo de visualización. Bueno, vi los signos de interrogación durante la depuración en la vista de variables de Eclipse (donde todos los caracteres especiales están OK en mi programa), también en los archivos log4j, en la base de datos donde se insertan estos nombres y finalmente cuando los archivos fueron descargados al cliente . – jabal

+0

Siempre empiezo a examinar tales problemas mediante la depuración. Si puedo ver la cadena correcta en la ventana de mi reloj, es fácil rastrear dónde se equivocan. Sin embargo, en este caso, en el primer momento cuando obtengo mi nombre de archivo, es incorrecto. – jabal

+0

Según tengo entendido, el navegador le dice a la codificación de su mensaje en el encabezado HTTP. Cuando se analiza la solicitud, se debe usar esta codificación. El Apache javadoc también dice para ServletFileUpload.setHeaderEncoding: "Cuando no se especifica, o nulo, se utiliza la codificación de solicitud". En mi caso, enc = request.getCharacterEncoding(); resultó en "UTF-8", así que creo que esto es lo que envía el navegador. ¿Pero por qué el analizador no puede obtener el nombre de archivo correcto, entonces ...?:-( – jabal

2

Resolvió el problema llamando a la instancia de ServletFileUpload '.setHeaderEncoding ("ISO-8858-2") explícitamente.

+1

Use ISO-8859-2 en lugar de ISO-8858-2 que no es compatible con Java: http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html; accedemos a java.io.UnsupportedEncodingException: ISO-8858-2 al usar ISO-8858- . 2 codificación DiskFileUpload carga = new DiskFileUpload(); upload.setHeaderEncoding ("ISO-8859-2") –

0

Para estos charecters especiales, puede configurar la codificación en "iso 8859-1". El UTF-8 parece ser que no trabaja ..

Si ur no establecer ningún tipo de codificación .. Entonces máquina Linux se llevará a la codificación predeterminada que es UTF-8 y ventanas tomarán la codificación compatible

Cuestiones relacionadas