Java apache.commons.net.ftp.FTPClient未将文件上载到所需文件夹
我使用以下代码将xml文件上载到服务器中的/home/domainname/public\u html/guest目录。但是,该文件仅上载到位置/home/domainname。它没有上载到子目录。请告知 FTPClient client=新的FTPClient(); FileInputStream fis=nullJava 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
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()返回
调用以斜杠开头,不应该
/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()返回
调用以斜杠开头,不应该
/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.");
}