使用Apache FTPClient 3.1和FTP.BINARY_FILE_TYPE上传后,JAVA 6和损坏的文件

时间:2012-11-09 15:44:07

标签: java upload ftp apache-commons ftp-client

我真的很喜欢疯狂。

我正在编写一个小型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!?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

当有人给我发电子邮件给我一个关于确保在登录后将模式类型设置为二进制的建议时,问题就解决了。