Java apache.commons.net.ftp.FTPClient未将文件上载到所需文件夹

Java apache.commons.net.ftp.FTPClient未将文件上载到所需文件夹,java,linux,ftp,apache-commons-net,Java,Linux,Ftp,Apache Commons Net,我使用以下代码将xml文件上载到服务器中的/home/domainname/public\u html/guest目录。但是,该文件仅上载到位置/home/domainname。它没有上载到子目录。请告知 FTPClient client=新的FTPClient(); FileInputStream fis=null try { client.connect(Util.getProductsXMLFTPServer()); client.login(Uti

我使用以下代码将xml文件上载到服务器中的/home/domainname/public\u html/guest目录。但是,该文件仅上载到位置/home/domainname。它没有上载到子目录。请告知

FTPClient client=新的FTPClient(); FileInputStream fis=null

    try {
        client.connect(Util.getProductsXMLFTPServer());
        client.login(Util.getProductsXMLFTPUser(), Util.getProductsXMLFTPPassword());

        //
        // Create an InputStream of the file to be uploaded
        //

        fis = new FileInputStream(new File(Util.getProductsXMLFTPInputFilePath(), Util.getProductsXMLFTPOutputFileName()));
        client.changeWorkingDirectory(Util.getProductsXMLFTPUploadPath());


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

我检查了你的代码,它正常工作。我只将文件类型声明更改为二进制,XML文件可能不需要这样做。 以下是我的完整代码供参考:

package apachenet.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class App {
    public static void main( String[] args ) {
        FTPClient client = new FTPClient(); 
        FileInputStream fis = null;
        try {
            client.connect(/*Util.getProductsXMLFTPServer()*/"127.0.0.1");
            client.login(/*Util.getProductsXMLFTPUser()*/"pwyrwinski", 
                    /*Util.getProductsXMLFTPPassword()*/"secret");
            client.setFileType(FTP.BINARY_FILE_TYPE); // optional
            fis = new FileInputStream(
                    new File(/* Util.getProductsXMLFTPInputFilePath() */"/home/pwyrwinski", 
                            /* Util.getProductsXMLFTPOutputFileName() */"img.png"));
            client.changeWorkingDirectory(/*Util.getProductsXMLFTPUploadPath()*/ "someDir");


            client.storeFile(/*Util.getProductsXMLFTPOutputFileName()*/"img_bis.png", fis);
            client.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
                client.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
正如你所看到的,它和你的差不多。
Util
类调用将替换为原始数据

当我运行它时,文件
/home/pwyrwinski/img.png
被上传到FTP服务器上的
{FTP\u USER\u ROOT}/someDir
目录,名称更改为
img\u bis.png
。我想这正是你想要实现的

让我们回到你的问题上来

  • 尝试检查从中返回的内容
    Util.getProductsXMLFTPUploadPath()
    call。我猜不是什么 您正期待-所以在IDE中调试它或将其打印到控制台
  • 检查路径是否从
    Util.getProductsXMLFTPUploadPath()返回
    调用以斜杠开头,不应该
  • 更新1。 服务器上是否存在direcory
    /home/domainname/public\u html/guest

    将以下方法添加到类中:

    private static void showServerReply(FTPClient ftpClient) {
        String[] replies = ftpClient.getReplyStrings();
        if (replies != null && replies.length > 0) {
            for (String aReply : replies) {
                System.out.println("SERVER: " + aReply);
            }
        }
    }
    
    并在每次ftp客户端的方法调用后调用它。这将为您提供每个命令结果的代码和说明。我怀疑
    client.changeWorkingDirectory(…)
    以错误结尾,可能是:
    550权限被拒绝(或者没有这样的文件或文件夹)

    下一次修改将是:

    client.login(Util.getProductsXMLFTPUser(), Util.getProductsXMLFTPPassword());
    System.out.println(client.printWorkingDirectory()); // added this line!
    
    这将告诉我们登录后当前的工作目录是什么


    请发布您的结果。

    我检查了您的代码,它工作正常。我只将文件类型声明更改为二进制,XML文件可能不需要这样做。
    FTPClient ftpClient = new FTPClient();
            try {
                  System.out.println("before server connection");
                ftpClient.connect(server, port);
                System.out.println("before user name and passwod");
                ftpClient.login(user, pass);
                ftpClient.enterLocalActiveMode();
    
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    
                System.out.println("connection sucess");
    
    
                // windows working fine
                File secondLocalFile = new File("/home/aims/archived_reports/tes_S_000000123/test.pdf");
    //            String secondRemoteFile = "/archived_reports/PermanentRecord.pdf";
    
    //linux
              //  File secondLocalFile = new File("/archived_reports/tes_S_000009123/test.pdf");
    
                String secondRemoteFile = "remotefilename.pdf";
                InputStream  inputStream = new FileInputStream(secondLocalFile);
    
                System.out.println("Start uploading second file");
    
                        ftpClient.changeWorkingDirectory("/reports");// home/ftp.test/reports folder
    
    
              System.out.println("Prasent Working Directory :"+ftpClient.printWorkingDirectory());
    
    
                OutputStream outputStream = ftpClient.storeFileStream(secondRemoteFile);
                     int returnCode = ftpClient.getReplyCode();
                     System.out.println(returnCode);
                byte[] bytesIn = new byte[4096];
                int read = 1;
    
                while ((read = inputStream.read(bytesIn)) != -1) {
                    outputStream.write(bytesIn, 0, read);
                }
    
    System.out.println();           
                inputStream.close();
                outputStream.close();
                         boolean completed = ftpClient.completePendingCommand();
                if (completed) {
                    System.out.println("The second file is uploaded successfully.");
                }
    
    以下是我的完整代码供参考:

    package apachenet.ftp;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    
    public class App {
        public static void main( String[] args ) {
            FTPClient client = new FTPClient(); 
            FileInputStream fis = null;
            try {
                client.connect(/*Util.getProductsXMLFTPServer()*/"127.0.0.1");
                client.login(/*Util.getProductsXMLFTPUser()*/"pwyrwinski", 
                        /*Util.getProductsXMLFTPPassword()*/"secret");
                client.setFileType(FTP.BINARY_FILE_TYPE); // optional
                fis = new FileInputStream(
                        new File(/* Util.getProductsXMLFTPInputFilePath() */"/home/pwyrwinski", 
                                /* Util.getProductsXMLFTPOutputFileName() */"img.png"));
                client.changeWorkingDirectory(/*Util.getProductsXMLFTPUploadPath()*/ "someDir");
    
    
                client.storeFile(/*Util.getProductsXMLFTPOutputFileName()*/"img_bis.png", fis);
                client.logout();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (fis != null) {
                        fis.close();
                    }
                    client.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    正如你所看到的,它和你的差不多。
    Util
    类调用将替换为原始数据

    当我运行它时,文件
    /home/pwyrwinski/img.png
    被上传到FTP服务器上的
    {FTP\u USER\u ROOT}/someDir
    目录,名称更改为
    img\u bis.png
    。我想这正是你想要实现的

    让我们回到你的问题上来

  • 尝试检查从中返回的内容
    Util.getProductsXMLFTPUploadPath()
    call。我猜不是什么 您正期待-所以在IDE中调试它或将其打印到控制台
  • 检查路径是否从
    Util.getProductsXMLFTPUploadPath()返回
    调用以斜杠开头,不应该
  • 更新1。 服务器上是否存在direcory
    /home/domainname/public\u html/guest

    将以下方法添加到类中:

    private static void showServerReply(FTPClient ftpClient) {
        String[] replies = ftpClient.getReplyStrings();
        if (replies != null && replies.length > 0) {
            for (String aReply : replies) {
                System.out.println("SERVER: " + aReply);
            }
        }
    }
    
    并在每次ftp客户端的方法调用后调用它。这将为您提供每个命令结果的代码和说明。我怀疑
    client.changeWorkingDirectory(…)
    以错误结尾,可能是:
    550权限被拒绝(或者没有这样的文件或文件夹)

    下一次修改将是:

    client.login(Util.getProductsXMLFTPUser(), Util.getProductsXMLFTPPassword());
    System.out.println(client.printWorkingDirectory()); // added this line!
    
    这将告诉我们登录后当前的工作目录是什么


    请发布您的结果。

    我验证了路径。这是正确的。我试图删除“/”,但它仍然是一样的。不要超出我提到的目录。非常感谢。这对我帮助很大。我将参数改为“public\u html/guest”,而不是“/home/domainuser/public\u html/guest”。似乎它试图从当前位置定位完整的目录路径。它给了我一个错误消息,说目录不存在。再次非常感谢。它像魔术一样工作。我验证了路径。这是正确的。我试图删除“/”,但它仍然是一样的。不要超出我提到的目录。非常感谢。这对我帮助很大。我将参数改为“public\u html/guest”,而不是“/home/domainuser/public\u html/guest”。似乎它试图从当前位置定位完整的目录路径。它给了我一个错误消息,说目录不存在。再次非常感谢。它起了神奇的作用。
    FTPClient ftpClient = new FTPClient();
            try {
                  System.out.println("before server connection");
                ftpClient.connect(server, port);
                System.out.println("before user name and passwod");
                ftpClient.login(user, pass);
                ftpClient.enterLocalActiveMode();
    
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    
                System.out.println("connection sucess");
    
    
                // windows working fine
                File secondLocalFile = new File("/home/aims/archived_reports/tes_S_000000123/test.pdf");
    //            String secondRemoteFile = "/archived_reports/PermanentRecord.pdf";
    
    //linux
              //  File secondLocalFile = new File("/archived_reports/tes_S_000009123/test.pdf");
    
                String secondRemoteFile = "remotefilename.pdf";
                InputStream  inputStream = new FileInputStream(secondLocalFile);
    
                System.out.println("Start uploading second file");
    
                        ftpClient.changeWorkingDirectory("/reports");// home/ftp.test/reports folder
    
    
              System.out.println("Prasent Working Directory :"+ftpClient.printWorkingDirectory());
    
    
                OutputStream outputStream = ftpClient.storeFileStream(secondRemoteFile);
                     int returnCode = ftpClient.getReplyCode();
                     System.out.println(returnCode);
                byte[] bytesIn = new byte[4096];
                int read = 1;
    
                while ((read = inputStream.read(bytesIn)) != -1) {
                    outputStream.write(bytesIn, 0, read);
                }
    
    System.out.println();           
                inputStream.close();
                outputStream.close();
                         boolean completed = ftpClient.completePendingCommand();
                if (completed) {
                    System.out.println("The second file is uploaded successfully.");
                }