public class DynamicFtpSessionFactory {
private final ApplicationContext context;
public DynamicFtpSessionFactory(@NonNull final ApplicationContext context) {
this.context = context;
}
public void registerFtpSessionFactory(@NonNull final String beanName,
@NonNull final String host,
final int port,
@NonNull final String username,
@NonNull final String password) {
final BeanDefinitionRegistry registry = (BeanDefinitionRegistry) ((AnnotationConfigApplicationContext) context).getBeanFactory();
final BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(DefaultFtpSessionFactory.class);
builder.addPropertyValue("host", host);
builder.addPropertyValue("port", port);
builder.addPropertyValue("username", username);
builder.addPropertyValue("password", password);
builder.addPropertyValue("fileType", FTP.ASCII_FILE_TYPE);
registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
// Optionally wrap in a CachingSessionFactory
final DefaultFtpSessionFactory ftpSessionFactory = (DefaultFtpSessionFactory) context.getBean(beanName);
registry.registerBeanDefinition(beanName, BeanDefinitionBuilder.genericBeanDefinition(CachingSessionFactory.class)
.addConstructorArgValue(ftpSessionFactory)
.getBeanDefinition());
}
}
服务:
public void uploadFileForGroupId(@NonNull final String groupId, @NonNull final Resource reportFile) throws IOException {
final CachingSessionFactory session = getFtpSessionFactory(groupId);
// Upload report file to FTP server
try (InputStream inputStream = reportFile.getInputStream()) {
session.getSession().write(inputStream, reportFile.getFilename());
log.info("File {} uploaded successfully for group Id {}.", reportFile.getFilename(), groupId);
} catch (IOException e) {
log.error("Failed to upload file: ", e);
} finally {
session.getSession().close();
}
}
private CachingSessionFactory getFtpSessionFactory(@NonNull final String groupId) {
final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh(); // Initialize the context without any configuration class
final String ftpBeanName = groupId + "Caching";
if (context.containsBean(ftpBeanName)) {
return context.getBean(ftpBeanName, CachingSessionFactory.class);
}
final DynamicFtpSessionFactory dynamicFtpSessionFactory = new DynamicFtpSessionFactory(context);
final AnfDirectoryEntity anfDirectory = getFtpConnectionDetails(groupId);
dynamicFtpSessionFactory.registerFtpSessionFactory(ftpBeanName,
anfDirectory.getSftpConnection().getSftpServer(),
FTP_PORT,
anfDirectory.getSftpConnection().getSftpUser(),
anfDirectory.getSftpConnection().getSftpPassword());
return context.getBean(ftpBeanName, CachingSessionFactory.class);
}
i我能够使用FTP命令从我的计算机上传到FTP服务器上传文件。因此,如果我能够通过FTP命令上传,为什么不从Java应用程序中上传?
450是一个FTP响应代码,表明已经发生了瞬态(4xxx)文件系统(X5X)错误。很难说出的基本问题可能是服务器上的文件权限,或者耗尽了空间。我不认为您的代码是问题所在,尽管很难说,因为我们不知道该FTP客户端库的实现是什么。