2008-09-03 65 views
4

我有一些Java代碼使用Servlet和Apache Commons FileUpload將文件上傳到設置目錄。它對字符數據(例如文本文件)工作正常,但圖像文件出現亂碼。我可以打開它們,但圖像看起來不像是應該的。這裏是我的代碼:爲什麼我的圖像出現亂碼?

的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(流)的樣子:

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

最後FileManager.createFile樣子:

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

任何人都可以點我做錯了什麼?

乾杯, 李

回答

4

有一件事我不喜歡的是這裏在此塊從StreamUtils.getBytes():

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

在第6行,它寫入整個緩衝區,不管有多少字節讀取我我不相信這將永遠是這樣。它會是這樣更正確:

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 } 

註上行線5「其他」,用兩個附加參數沿(數組索引開始位置和長度來複制)6.

我所能想象一下,對於較大的文件,如圖像,緩衝區在填充之前會返回(也許它正在等待更多)。這意味着你會無意中寫入剩餘在緩衝區尾部的舊數據。這在EoF的大部分時間裏幾乎肯定會發生,假設緩衝區大於1個字節,但EoF中的額外數據可能不是您腐敗的原因......這是不可取的。

0

您確保圖像不會出現亂碼通過,或者你是不是在路上丟棄一些數據包到來。

0

我不知道有什麼區別它使得,但似乎有方法簽名的不匹配。該getBytes()方法中調用的方法doPost()只有一個說法:

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

,而你包括方法源有兩個參數:

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

希望有所幫助。

0

您可以對原始文件和上傳的文件執行校驗和,看看是否有任何即時差異?

如果有,那麼你可以看看執行差異,以確定文件的缺失改變的確切部分。

流行在腦海的東西是流或端的開始或結束。

1

我只是使用commons io然後你可以做一個IOUtils。複製(InputStream,OutputStream);

它有很多其他有用的實用方法。

相關問題