FTP客户端问题

时间:2011-09-09 01:25:04

标签: java ftp file-transfer data-transfer

我很难搞清楚事情。 (我对这一切都很陌生。) 我把这个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个字节。

非常感谢任何人的帮助。 谢谢 丹。

2 个答案:

答案 0 :(得分:3)

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

您使用的是Apache's FTP客户端吗?它表示默认为ASCII,您可以尝试使用BINARY_FILE_TYPE设置setFileType

client.setFileType(FTPClient.BINARY_FILE_TYPE);

答案 1 :(得分:1)

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

您只使用INPUT流,并且您还需要使用输出流

我希望这个例子可以帮到你:

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