簡體   English   中英

使用Apache FTPClient 3.1和FTP.BINARY_FILE_TYPE上傳后,JAVA 6和損壞的文件

[英]JAVA 6 and corrupted files after uploading using Apache FTPClient 3.1 and FTP.BINARY_FILE_TYPE

我真的對此瘋狂。

我正在編寫一個小型Java(必須是SDK 6)工具,使用commons-net-3.1.jar庫將一堆文件同時上傳到另一組服務器。 我將主要使用.jpg圖像。 在有人問:)之前我將連接設置為BINARY_FILE_TYPE

當我嘗試運行它時,一切都順利但有時,在上傳圖像后,它們上面有“小線條”,就像文件在路上被損壞一樣。

這段代碼就是完成所有工作的人。 有關在os.write失敗時如何管理第一次捕獲以保持文件正確上傳的任何線索?

try {
    InputStream is = new FileInputStream(rutaFichero);
    OutputStream os = ftp.storeFileStream(nombreFichero);
    byte buf[] = new byte[8192];
    bytesRead = is.read(buf);

    while ((bytesRead = is.read(buf)) != -1) {
        try {
            os.write(buf, 0, bytesRead);
        } catch (IOException ioe) {
        } catch (NullPointerException npe) {
        }
    }

    is.close();
    try {
        os.close();
        completado = ftp.completePendingCommand();
        if (completado) {
    } catch (NullPointerException npe) {}
}

出於好奇,我認為這可能只是條件上的惡劣條件所以我在轉移了幾天之后檢查了文件的大小並且......沒有一個匹配! WTF!?

你在第一行有一個錯誤:

bytesRead = is.read(buf);

while ((bytesRead = is.read(buf)) != -1) {
    try {
        os.write(buf, 0, bytesRead);
    } catch (IOException ioe) {
    } catch (NullPointerException npe) {
    }
}

你永遠不會寫第一個buf內容。 您只需讀取它們,然后在while循環中讀取后續塊。 刪除第一個is.read() ,你會沒事的。

這是避免這種繁瑣代碼的另一個原因,並采用IOUtils.copy()等實用方法:

InputStream is = new FileInputStream(rutaFichero);
OutputStream os = ftp.storeFileStream(nombreFichero);
IOUtils.copy(is, os);
is.close();
os.close();

當一些人給我發電子郵件給我一個關於確保在登錄后將模式類型設置為二進制的建議時,問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM