【问题标题】:FTP Client issueFTP客户端问题
【发布时间】:2011-11-13 10:46:36
【问题描述】:

我很难弄清楚一些事情。 (我对这一切都很陌生。) 我写了这个 java pgm 来将一个大文件 ftp 到目标服务器。 下面是代码(代码稍作修改以便显示):

public static void ftpUpload(String path, String upfileName, String dirName) throws Exception
{
    FTPClient client = new FTPClient();
    client.addProtocolCommandListener((ProtocolCommandListener) new PrintCommandListener(new PrintWriter(System.out)));
    client.enterLocalPassiveMode();

    FileInputStream fis = null;

    int reply;

    try {
        client.connect(ftpserver);
        client.login(ftpuserid, ftppasswd);
        reply = client.getReplyCode();

        if(FTPReply.isPositiveCompletion(reply)){
            client.changeWorkingDirectory(ftpdirectoryName + "/" + dirName);

            boolean mkDir = client.makeDirectory(getCurrentMMMYY().toLowerCase());

            client.changeWorkingDirectory(getCurrentMMMYY().toLowerCase());

              //Create an InputStream of the file to be uploaded
            fis = new FileInputStream(path + upfileName);

            //Store file to server
            client.storeFile(upfileName, fis);

        }    
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
            client.logout();
            //client.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我正在发送的文件发生了一些奇怪的事情...... 我在原始服务器上的一个文件大小为 82575786,当我 ftp 这个文件时,它几乎发送了整个文件。它实际上发送了 82574867。(缺少 919) 原始服务器上的另一个文件是 717885,当我 ftp 这个文件时,它几乎发送了整个文件。它实际上发送了 717522。(缺少 363)

我拉了日志看看是否有什么崩溃了,但它没有显示传输有任何问题。这是显示传输的 2 个日志条目。

[08/09/11 20:21:13:618 EDT] 00000043 SystemOut O 221-您已在 1 个文件中传输了 717522 个字节。 221-您已在 1 个文件中传输了 82574867 字节。

任何人的帮助将不胜感激。 谢谢 丹。

【问题讨论】:

  • 请问为什么一定要用输入和输出流,为什么sendfile只取一个输入流却不起作用?谢谢!

标签: java ftp file-transfer data-transfer


【解决方案1】:

您是否以 ASCII 模式而不是二进制模式传输? ASCII 模式将 CR/LF 转换为 LF,反之亦然,具体取决于服务器和客户端设置。

您使用的是Apache's FTP 客户端吗?它说默认是ASCII,你可以尝试设置BINARY_FILE_TYPEsetFileType:

client.setFileType(FTPClient.BINARY_FILE_TYPE);

【讨论】:

  • 感谢 Jason,通过添加二进制文件类型,文件稍微领先了一点,但它仍然没有 ftp 整个文件。两个文件仍然没有得到最后几条记录。
【解决方案2】:

要上传二进制文件,您必须使用 FTP.BINARY_FILE_TYPE 但还不够。

你只使用了一个输入流,你也需要使用一个输出流

希望这个例子对你有所帮助:

FTPClient client = new FTPClient();
client.connect("192.168.30.20");
client.login("pwd", "pwd");

client.setFileType(FTP.BINARY_FILE_TYPE);
String path_base = "/myPath/";
InputStream fis = new FileInputStream("A.pdf");
OutputStream os = client.storeFileStream(path_base+ "B.pdf");


byte buf[] = new byte[8192];
int bytesRead = fis.read(buf);
while (bytesRead != -1) {
   os.write(buf, 0, bytesRead);
   bytesRead = fis.read(buf);}

fis.close();
os.close();
client.completePendingCommand();
client.logout();
client.disconnect();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多