Pregunta

Tengo un poco de código Java mediante un servlet y Apache Commons FileUpload para cargar un archivo a un directorio.Es trabajo fino de datos de carácter (por ejemplo,los archivos de texto), pero los archivos de imagen están saliendo distorsionado.Puedo abrir, pero la imagen no se ve como debería.Aquí está mi código:

Servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    try {
      String customerPath = "\\leetest\\";

      // Check that we have a file upload request
      boolean isMultipart = ServletFileUpload.isMultipartContent(request);

      if (isMultipart) {
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload();

        // Parse the request
        FileItemIterator iter = upload.getItemIterator(request);
        while (iter.hasNext()) {
          FileItemStream item = iter.next();
          String name = item.getFieldName();
          if (item.isFormField()) {
            // Form field.  Ignore for now
          } else {
            BufferedInputStream stream = new BufferedInputStream(item
                .openStream());
            if (stream == null) {
              LOGGER
                  .error("Something went wrong with fetching the stream for field "
                      + name);
            }

            byte[] bytes = StreamUtils.getBytes(stream);
            FileManager.createFile(customerPath, item.getName(), bytes);

            stream.close();
          }
        }
      }
    } catch (Exception e) {
      throw new UploadException("An error occured during upload: "
          + e.getMessage());
    }
}

StreamUtils.getBytes(stream) se ve así:

public static byte[] getBytes(InputStream src, int buffsize)
      throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    byte[] buff = new byte[buffsize];
    while (true) {
      int nBytesRead = src.read(buff);
      if (nBytesRead < 0) {
        break;
      }
      byteStream.write(buff);
    }

    byte[] result = byteStream.toByteArray();
    byteStream.close();

    return result;
}

Y por último FileManager.createFile parece:

public static void createFile(String customerPath, String filename,
      byte[] fileData) throws IOException {
    customerPath = getFullPath(customerPath + filename);
    File newFile = new File(customerPath);
    if (!newFile.getParentFile().exists()) {
      newFile.getParentFile().mkdirs();
    }

    FileOutputStream outputStream = new FileOutputStream(newFile);
    outputStream.write(fileData);
    outputStream.close();
  }

Puede alguien irregular lo que estoy haciendo mal?

Saludos, Lee

¿Fue útil?

Solución

Una cosa que no me gusta es aquí, en este bloque de StreamUtils.getBytes():

 1 while (true) {
 2   int nBytesRead = src.read(buff);
 3   if (nBytesRead < 0) {
 4     break;
 5   }
 6   byteStream.write(buff);
 7 }

En la línea 6, se escribe el buffer completo, no importa cuántos bytes se leen en.No estoy convencido de que este va a ser siempre el caso.Sería más correcto como esta:

 1 while (true) {
 2   int nBytesRead = src.read(buff);
 3   if (nBytesRead < 0) {
 4     break;
 5   } else {
 6     byteStream.write(buff, 0, nBytesRead);
 7   }
 8 }

Nota el 'otro' en la línea 5, junto con los dos parámetros adicionales (índice de matriz posición de inicio y la longitud de la copia) en la línea 6.

Me imagino que para archivos más grandes, como las imágenes, el búfer se devuelve antes de que se llena (tal vez se está a la espera de más).Eso significa que usted sería sin querer escribir los datos antiguos que se quedan en el extremo de la cola del buffer.Esto es casi seguro que pasando la mayoría del tiempo en Ef, suponiendo un buffer > 1 byte, pero los datos adicionales en Ef probablemente no es la causa de su corrupción...es no sólo deseable.

Otros consejos

Yo acababa de uso commons io Entonces usted podría IOUtils.copia(InputStream, OutputStream);

Que tiene un montón de otros métodos de utilidad.

¿Estás seguro de que la imagen no viene a través de la ilegibles o que no se dejan caer algunos paquetes en el camino.

No sé qué diferencia hay, pero no parece ser un error de método de firmas.El getBytes() método de llamada en tu doPost() método sólo tiene un argumento:

byte[] bytes = StreamUtils.getBytes(stream);

mientras que el método de fuente que incluye tiene dos argumentos:

public static byte[] getBytes(InputStream src, int buffsize)

Espero que ayude.

Puedes realizar una suma de comprobación en el archivo original y el archivo subido y ver si hay alguna inmediato diferencias?

Si hay entonces usted puede mirar en la realización de un diff, para determinar la parte exacta(s) de los archivos que faltan cambiado.

Cosas que aparecen a la mente es el principio o el final de la secuencia, o "endian".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top