我检查了你的代码,它有效。我只是将文件类型声明更改为二进制,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_USER_ROOT}/someDir
ftp 服务器上的目录,名称更改为img_bis.png
. 我认为这正是您想要实现的目标。
让我们回到你的问题。
- 尝试检查
Util.getProductsXMLFTPUploadPath()
调用返回的内容。我的猜测是这不是你所期望的 - 所以在你的 IDE 中调试它或将它打印到控制台。
- 检查调用返回的路径是否
Util.getProductsXMLFTPUploadPath()
以斜杠开头,它不应该。
更新 1.服务器上
是否/home/domainname/public_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 Permission Denied (or No such file or folder)
.
下一个修改将是:
client.login(Util.getProductsXMLFTPUser(), Util.getProductsXMLFTPPassword());
System.out.println(client.printWorkingDirectory()); // added this line!
这将告诉我们登录后当前的工作目录是什么。
请发布您的结果。