FTPClient下载文件失败,retrieveFile()方法replyCode = 550

时间:2011-09-26 17:18:53

标签: java ftp apache-commons-net

/ * 我在localhost上运行一个FTP服务器。当我下载文件时使用ftpClient.retrieveFile()方法,它的replyCode是550。我读了commons-net的API并找到550 replyCode,定义是“public static final int FILE_UNAVAILABLE 550”。但我无法从我的代码中找到问题。
谢谢你的帮助。

* /

    FTPClient ftpClient = new FTPClient();
    FileOutputStream fos = null;

    try {
        ftpClient.connect("192.168.1.102",2121);
        ftpClient.login("myusername", "12345678");
        ftpClient.setControlEncoding("UTF-8");
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        String remoteFileName = "ftpserver.zip";//this file in the rootdir
        fos = new FileOutputStream("f:/down.zip");
        ftpClient.setBufferSize(1024);
        ftpClient.enterLocalPassiveMode();
        ftpClient.enterLocalActiveMode();
        ftpClient.retrieveFile(remoteFileName, fos);  
        System.out.println("retrieveFile?"+ftpClient.getReplyCode());
        fos.close();
        ftpClient.logout();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            ftpClient.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("关闭FTP异常", e);
        }
    }

6 个答案:

答案 0 :(得分:8)

我发现Apache retrieveFile(...)有时无法使用超过特定限制的文件大小。为了克服这个问题,我会使用retrieveFileStream()代替。在下载之前,我已经设置了Correct FileType并将Mode设置为PassiveMode

所以代码看起来像

    ....
    ftpClientConnection.setFileType(FTP.BINARY_FILE_TYPE);
    ftpClientConnection.enterLocalPassiveMode();
    ftpClientConnection.setAutodetectUTF8(true);

    //Create an InputStream to the File Data and use FileOutputStream to write it
    InputStream inputStream = ftpClientConnection.retrieveFileStream(ftpFile.getName());
    FileOutputStream fileOutputStream = new FileOutputStream(directoryName + "/" + ftpFile.getName());
    //Using org.apache.commons.io.IOUtils
    IOUtils.copy(inputStream, fileOutputStream);
    fileOutputStream.flush();
    IOUtils.closeQuietly(fileOutputStream);
    IOUtils.closeQuietly(inputStream);
    boolean commandOK = ftpClientConnection.completePendingCommand();
    ....

答案 1 :(得分:2)

FTP错误550 未采取请求的行动。文件不可用,找不到,无法访问

所以我认为enconding有点奇怪,我没有设置控制编码并使用retrieveFile只是在java中发送一个普通的String。 这一行:

ftpClient.retrieveFile(new String(remoteFileName.getBytes("ms932"),"ISO-8859-1"), fos);

不执行任何操作,因为您正在从另一个字符串创建新的Java字符串。 如果我没有弄错的话,Java字符串将以不同的编码保存在内存中,与所有编码兼容。

此外,您使用的路径是错误的,请参阅:

String remoteFileName = "//ftpserver.zip";

Ftp将导致使用/启动路径时出错 试试这个:

"ftpserver.zip"

或者如果你有一个子目录,试试这个:

"subdir/myfile.zip"

干杯

答案 2 :(得分:1)

最近我遇到了同样的错误,但主要是因为路径不正确,而不是在/data/csms/trt/file.txt中附加斜杠,它被附加为/data/csms/trtfile.txt ...所以没有从所需位置检索文件。

答案 3 :(得分:0)

需要在连接之前调用setControlEncoding,就像这个

一样
[...]
try {
    ftpClient.setControlEncoding("UTF-8");
    ftpClient.connect("192.168.1.102",2121);
    ftpClient.login("myusername", "12345678");
[...]

答案 4 :(得分:0)

看起来输出路径不正确。检查服务器上的共享根目录。如果root是f:\并且你的文件在这个根目录中,那么你只需要这样做:`fos = new FileOutputStream(“down.zip”);

如果您的文件位于根目录的子目录中,例如f:\ sub,那么它应该是fos = new FileOutputStream("sub\\down.zip");

答案 5 :(得分:0)

我遇到了同样的问题,因为我的SDCARD / PHONE内存没有空间。