2012-11-09 57 views
1

我真的很忙碌。JAVA 6和使用Apache FTPClient 3.1和FTP上传后损坏的文件.BINARY_FILE_TYPE

我正在编写一个使用commons-net-3.1.jar库将一堆文件同时上传到另一堆服务器的小型Java(必须是SDK 6)工具。我将主要使用.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) {} 
} 

出于好奇,我想这可能是上线只是坏的条件,所以我选中的文件的大小transfering了一些日子后......他们都不匹配! WTF!?

回答

2

您在这里的第一行中的错误:

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(); 
+0

我错误地输入了该行,不在我的代码中,但感谢您指出它。我更改为IOUtils.copy()并且生活更容易,但是,问题一直没有解决,直到其他人向我发送了一封电子邮件,告诉我有关确定将模式类型设置为二进制后的建议登录,从来没有和...嘿,嘿,它的工作! 非常感谢您的帮助Tomasz。 恩......如何设置此问题解决? – gobispo

+0

@gobispo:因为我的回答并没有真正帮助你,所以我建议你将你的评论改为另一个答案,并自我接受。祝你好运! –

+0

现在我明白了。我真的很陌生,不知道该怎么做。再次感谢Tomasz和你的回答,尽管不是我期望的方式,确实帮助我找到了一种更简单的方式来做事情:) – gobispo

2

当一些同事给我发了一封电子邮件给我,是一定要设置一个咨询的问题得到解决模式类型为二进制AFTER登录,从来没有。

+0

它也解决了我的问题,谢谢。 –

+0

修复了我的文件损坏问题! – Stark