Lors de l'utilisation de SFTP Session Factory de Spring Integration (avec la configuration Java), je voudrais définir dynamiquement le répertoire distant du serveur SFTP. Le printemps docs disent que cela est possible:Spring Integration FTP - Créer un répertoire dynamique avec expression de répertoire distant (Java config)
Spring Integration SFTP Adapters
Spel et l'adaptateur sortant SFTP
Comme beaucoup d'autres composants Spring Integration, vous pouvez bénéficier de la langue d'expression de printemps (SpEL) prend en charge lors de la configuration d'un adaptateur de canal sortant SFTP, en spécifiant deux attributs
remote-directory-expression
etremote-filename-generator-expression
(voir ci-dessus). Le contexte d'évaluation d'expression aura le message comme objet racine, vous permettant ainsi de fournir des expressions qui peuvent calculer dynamiquement le nom du fichier ou le chemin du répertoire existant base sur les données contenues dans le message (soit à partir de charge utile ou en-têtes). Dans le exemple ci-dessus, nous définissons l'remote-filename-generator-expression
attribut avec une valeur d'expression qui calcule le nom du fichier basé sur son nom d'origine, tout en ajoutant un suffixe: - foo.
Mais j'ai des problèmes pour l'implémenter. Je n'arrive pas à trouver un bon exemple qui utilise le langage d'expression SpEL de Spring. Le code ci-dessous fonctionne et envoie mes fichiers au répertoire racine tel qu'il est ci-dessous, ou un répertoire spécifique si j'en ai entré un dans LiteralExpression. Mais je voudrais échanger l'expression LiteralExpression avec une SpelExpression qui utilise l'en-tête "path", similaire à ce que j'ai fait avec l'en-tête "file" qui ajuste dynamiquement le nom du fichier à télécharger.
@Configuration
public class SftpConfig {
@Autowired
private SftpSettings sftpSettings;
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost(sftpSettings.getHostname());
factory.setPort(sftpSettings.getPort());
factory.setUser(sftpSettings.getUsername());
factory.setPassword(sftpSettings.getPassword());
factory.setAllowUnknownKeys(true);
return new CachingSessionFactory<LsEntry>(factory);
}
@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
public MessageHandler handler() {
SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
handler.setAutoCreateDirectory(true); // automatically create the remote directory
handler.setRemoteDirectoryExpression(new LiteralExpression(""));
handler.setFileNameGenerator(new FileNameGenerator() {
@Override
public String generateFileName(Message<?> message) {
return (String) message.getHeaders().get("filename");
}
});
return handler;
}
@MessagingGateway
public interface UploadGateway {
@Gateway(requestChannel = "toSftpChannel")
void upload(@Payload byte[] file, @Header("filename") String filename, @Header("path") String path);
}
}
Pour lancer le téléchargement de fichier j'exécuter ce code
@Autowired
private UploadGateway gateway;
byte[] file = "test".getBytes();
path = "mydirectory";
filename = "myfilename";
gateway.upload(file, filename, path); // edited to correct parameter order error
Eh bien, je vous suggère d'élever un JIRA sur le sujet (https://jira.spring.io/browse/INT) et nous devons fournir la variante 'setRemoteDirectoryExpressionString()' et ajouter un échantillon dans les documents. Ce n'est en effet pas évident pour les débutants. –
Terminé. [Numéro JIRA INT-4356] (https://jira.spring.io/browse/INT-4356) –