2008-09-03 5 views
4

J'ai du code Java en utilisant un servlet et Apache Commons FileUpload pour télécharger un fichier dans un répertoire set. Cela fonctionne bien pour les données de caractères (par exemple, les fichiers texte), mais les fichiers d'image sont brouillés. Je peux les ouvrir mais l'image ne semble pas devoir. Voici mon code:Pourquoi mon image sort-elle brouillée?

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 (flux) ressemble à:

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; 
} 

Et enfin FileManager.createFile ressemble:

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(); 
    } 

Can spot tout le monde ce que je fais mal?

Cheers, Lee

Répondre

4

Une chose que je n'aime pas ici dans ce bloc de StreamUtils.getBytes():.

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

À la ligne 6, il écrit le tampon entier, peu importe combien d'octets sont lus dans I Je ne suis pas convaincu que ce sera toujours le cas. Il serait plus correct comme ceci:

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 } 

Notez le « autre » sur la ligne 5, ainsi que sur la ligne 6.

les deux paramètres supplémentaires (index de tableau position de départ et la longueur de copier) je pouvais Imaginez que pour les fichiers plus volumineux, comme les images, le tampon retourne avant qu'il ne soit rempli (peut-être en attend-il plus). Cela signifie que vous écririez involontairement les anciennes données qui restaient dans la fin de la mémoire tampon. Cela se passe presque certainement la plupart du temps à EoF, en supposant un tampon> 1 octet, mais les données supplémentaires à EoF ne sont probablement pas la cause de votre corruption ... ce n'est tout simplement pas souhaitable.

0

Etes-vous sûr que l'image ne vient pas par brouillées ou que vous n'êtes pas certains paquets sur laissez tomber la manière.

0

Je ne sais pas quelle différence cela fait, mais il semble y avoir une discordance de signatures de méthodes. La méthode getBytes() appelé dans votre méthode doPost() n'a qu'un seul argument:

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

tandis que la source de la méthode que vous avez inclus deux arguments:

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

espoir qui aide.

0

Pouvez-vous effectuer une somme de contrôle sur votre fichier d'origine, et le fichier téléchargé et voir s'il existe des différences immédiates? S'il y a alors vous pouvez regarder effectuer un diff, pour déterminer la partie exacte (s) du fichier qui est manquant changé.

Les choses qui viennent à l'esprit sont le début ou la fin du courant, ou l'endianisme.

1

Je voudrais simplement utiliser commons io Ensuite, vous pouvez simplement faire un IOUtils.copier (InputStream, OutputStream);

Il a beaucoup d'autres méthodes utilitaires utiles.

Questions connexes