Размещение файла в папке ведра S3

есть приложение для весенней загрузки, в котором я пытаюсь поместить файл в папку целевого ведра S3. целевой ведро / targetystem-папка / file.csv

Имя папки targetystem будет отличаться для каждого файла, который будет извлечен из файла конфигурации yml.

Папка targetystem должна быть создана с помощью кода, если папка не закрывается, и файл должен быть помещен в папку

Насколько я знаю, в ведре S3 нет концепции папок, и все они хранятся как объекты.

Прочитали некоторые документы, например, поместите файл в папку, должны указать ключевое выражение, например targetystem-folder / file.csv и bucket = target-bucket. Но не получается. Хотелось бы добиться этого с помощью spring-integration-aws без прямого использования aws-sdk

    <int-aws:s3-outbound-channel-adapter id="filesS3Mover"
        channel="filesS3MoverChannel"
        transfer-manager="transferManager"
        bucket="${aws.s3.target.bucket}"
        key-expression="headers.targetsystem-folder/headers.file_name"
        command="UPLOAD">
</int-aws:s3-outbound-channel-adapter>

Может ли кто-нибудь помочь по этому вопросу




Ответы (2)


Ваша проблема в том, что SpEL в key-expression не тот. Просто попробуйте начать с обычного кода Java и представьте, как вы хотели бы построить такое значение. Затем вы поймете, что в вашем выражении отсутствует операция конкатенации:

 key-expression="headers.targetsystem-folder + '/' + headers.file_name"

Также, пожалуйста, в будущем предоставьте больше информации об ошибке. В большинстве случаев трассировка стека полностью полезна.

person Artem Bilan    schedule 03.10.2018
comment
Оно работает. Как предполагается, в будущих вопросах будет предоставлена ​​трассировка стека. - person Jessie; 04.10.2018

В проекте, над которым я работал раньше, я просто использовал предоставленный java aws sdk. Затем в своей реализации я сделал что-то вроде этого

private void uploadFileTos3bucket(String fileName, File file) {
    s3client.putObject(new PutObjectRequest("target-bucket", "/targetsystem-folder/"+fileName, file)
            .withCannedAcl(CannedAccessControlList.PublicRead));
}

Конфигурацию больше не создавал. Он автоматически создает /targetsystem-folder внутри ведра (затем помещает в него файл), если он не существует, в противном случае помещает файл внутрь.


Вы можете использовать этот ответ как ссылку для дальнейшего объяснения темы.

В S3 нет «подкаталогов». Есть ведра, а в ведрах есть ключи.

Вы можете имитировать традиционные каталоги, используя поиск по префиксу. Например, в ведре можно хранить следующие ключи:

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2
person Royts    schedule 03.10.2018
comment
Благодарю за ответ. Хотел бы знать, что это может быть достигнуто с помощью самой spring -integration -aws с использованием исходящего адаптера без прямого использования aws-sdk - person Jessie; 03.10.2018
comment
Извините за непонимание вашего вопроса. Надеюсь, ты скоро найдешь ответ. - person Royts; 03.10.2018
comment
Этот ответ определенно показывает, что Spring Integration делает в своем S3MessageHandler, но не дает никаких подсказок для исходного запроса о расширении Spring Integration AWS. Пожалуйста, посмотрите мой ответ. - person Artem Bilan; 03.10.2018
comment
да, я неправильно понял его вопрос, так как раньше не использовал spring-integration-aws. Мне очень жаль. Спасибо за ответ, так как он мне тоже может понадобиться в будущем. +1 - person Royts; 03.10.2018