Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FTPClient download file failed,the retrieveFile() method replyCode=550

/* I run a FTP server on localhost.when I download files use ftpClient.retrieveFile() method,it's replyCode is 550 . I read the API of commons-net and find the 550 replyCode,the defines is" public static final int FILE_UNAVAILABLE 550".but I cannot find the problem from my codes.
thanks for your help.

*/

    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);
        }
    }
like image 863
Sipeng Avatar asked Sep 26 '11 17:09

Sipeng


2 Answers

I found that Apache retrieveFile(...) sometimes did not work with File Sizes exceeding a certain limit. To overcome that I would used retrieveFileStream() instead. Prior to download I have set the Correct FileType and set the Mode to PassiveMode

So the code will look like

    ....
    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();
    ....
like image 180
Vivek Kumar Avatar answered Nov 02 '22 23:11

Vivek Kumar


FTP Error 550 Requested action not taken. File unavailable, not found, not accessible

So I think the enconding is a bit wierd, I do not set control encoding and use the retrieveFile just sending a normal String in java. Also this line:

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

does nothing because you are creating a new Java string from another string. Java strings are kept in memory in a different encoding, compatible with all encodings if I am not mistaken.

Also, the path you are using is wrong, see:

String remoteFileName = "//ftpserver.zip";

Ftp will cause error starting a path with /, try this:

"ftpserver.zip"

or if you have a subdir, try this:

"subdir/myfile.zip"

Cheers

like image 28
fredcrs Avatar answered Nov 03 '22 00:11

fredcrs