当前位置: 首页 > 知识库问答 >
问题:

使用Apache Commons Net下载后FTP文件损坏

鄢修德
2023-03-14

由此下载的文件大小几乎相同,但在某些行中有所不同。每个答案都指向二进制文件类型。但这没用。有人对这个问题有什么想法吗?

FTPClient ftpClient = new FTPClient();
OutputStream outputStream = null;
boolean resultOk = true;

try {
    ftpClient.connect(host, port);
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileTransferMode(FTP.COMPRESSED_TRANSFER_MODE);
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
    resultOk &= ftpClient.login(usr, pwd);
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }

    outputStream = new FileOutputStream(localResultFile);
    resultOk &= ftpClient.retrieveFile(remoteSourceFile, outputStream);
    outputStream.flush();
    outputStream.close();

    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
    if (resultOk == true) {
        resultOk &= ftpClient.deleteFile(remoteSourceFile);
    }

    resultOk &= ftpClient.logout();
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
} finally {

    ftpClient.disconnect();
}

共有3个答案

宗政海
2023-03-14

当使用包含空间的未转义路径时,似乎会发生这种情况。E、 g.C:/文件和设置/测试

现在通过使用空间的转义路径解决了这个问题。谢谢你的帮助

呼延烈
2023-03-14

虽然我的问题与上传损坏有关,但我通过在ftp登录后移动文件类型集解决了类似问题(我不使用传输模式,将其保留为默认值):

resultOk &= ftpClient.login(usr, pwd);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

我在一些论坛上看到,在调用登录方法之前设置二进制文件类型可能会导致传输问题。在此更改之前,PDF文件已下载,但显示损坏的字体和元素。现在它工作了。希望它能帮助别人。

甘永春
2023-03-14

从您共享的文件中可以清楚地看出,传输确实发生在text/ascii模式下。

虽然FTP规范可能不需要,但对于某些FTP服务器(例如FileZilla服务器或ProFTPD),您无法在登录前更改传输类型。但IIS、ProFTPD或vsftpd等服务器对此没有问题。另一方面,FileZilla服务器默认为二进制模式(这是另一个违反规范的行为),因此您可能正在使用另一个。

在任何情况下,将. setFileType调用移动到. login之后。并测试其返回值。

并删除。setFileTransferMode调用。它对大多数服务器没有任何危害,因为几乎没有任何服务器支持模式C,因此无论如何都会忽略该调用。但是,如果您遇到这样的服务器,它将中断传输,因为FTPClient实际上不支持它。

 类似资料:
  • 我编写的下载文件的方法总是产生损坏的文件。 我通过adb访问这些文件,将它们传输到我的sccard,在那里我看到它们似乎有合适的大小,但没有根据例如Linux命令的类型。 你知道丢失了什么以及如何修复它吗? 谢谢。 代码的简单版本(但错误相同) 日志:< code > file . length:2485394 | content length:1399242 问题是,我从我的API单例中获得了,

  • 问题内容: 我正在使用角度$ http从服务器下载文件。文件类型可以不同。我应该设置请求标头以进行身份​​验证。下载完成后,文件已损坏!这是我在客户端保存文件的代码: 问题答案: 我最终通过将以下配置添加到ajax请求中解决了该问题: 并将Blob类型更改为 “应用程序/八位字节流”

  • 我正在IIS服务器上使用网站面板。我想使用ftp上载文件 我使用了以下代码: 这段代码运行没有错误。当我使用网站面板的文件管理器时,一个文件创建了“Name.ext”,但这个文件大小是0 KB。为什么?我有什么问题?! 我确信windows防火墙允许我这么做。 更新:我正在使用UploadFileTask和UploadFile(unasync)进行操作,但结果与async相同:(

  • 问题内容: 我以前使用Axios下载GET端点提供的文件。端点已更改,现在是POST,但是不需要参数。我正在更新原始的下载方法,但是返回了损坏的文件。 我不知道,如果问题出在,或如何响应的处理或全部的上方。到目前为止,我已经尝试了各种选择,但没有运气。任何建议将不胜感激! 我已经能够使用Postman下载文件,所以我知道端点提供的文件很好。我只是无法在我的React代码中理清参数来做到这一点。 问

  • 我试图通过调用Spring RESTendpoint在Reactjs中下载Excel文件,但我遇到了损坏文件的问题。 回应呼叫... Spring控制器…… 服务 当我执行上面的代码,我得到一个Excel文件o. k……但看response.data看起来像…… 嘎嘎��由于数据不可读,无法打开文件。打开服务器上创建的文件是可以的 欢迎任何想法 干杯