You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/06/20 16:34:01 UTC

(camel) branch main updated: CAMEL-23806: Split aws2-s3 docs into focused sub-pages

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new c7cd1f5d28c1 CAMEL-23806: Split aws2-s3 docs into focused sub-pages
c7cd1f5d28c1 is described below

commit c7cd1f5d28c14dff13c1991e8c0f4700fff2ff37
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Jun 20 18:33:54 2026 +0200

    CAMEL-23806: Split aws2-s3 docs into focused sub-pages
    
    Split the AWS S3 component documentation (2,515 lines) into 3 focused
    sub-pages, reducing the main page to 392 lines. Repetitive producer
    operation examples condensed into a common pattern section with a
    reference table, keeping detailed examples only for unique operations.
    
    - aws2-s3-producer-operations: 28 producer operations + IAM policies
    - aws2-s3-streaming: streaming upload with timestamp grouping
    - aws2-s3-consumer-examples: consumer patterns (prefix, filtering, done files)
    
    Closes #24151
    
    Co-Authored-By: Claude <no...@anthropic.com>
---
 .../src/main/docs/aws2-s3-component.adoc           | 2146 +-------------------
 .../src/main/docs/aws2-s3-consumer-examples.adoc   |  313 +++
 .../src/main/docs/aws2-s3-producer-operations.adoc |  478 +++++
 .../src/main/docs/aws2-s3-streaming.adoc           |  303 +++
 docs/components/modules/others/nav.adoc            |    3 +
 .../others/pages/aws2-s3-consumer-examples.adoc    |    1 +
 .../others/pages/aws2-s3-producer-operations.adoc  |    1 +
 .../modules/others/pages/aws2-s3-streaming.adoc    |    1 +
 8 files changed, 1112 insertions(+), 2134 deletions(-)

diff --git a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
index 4edcc0e06d43..ed3923fa2caf 100644
--- a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
+++ b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
@@ -246,1833 +246,13 @@ The order of evaluation for Default Credentials Provider is the following:
  - Web Identity Token from AWS STS.
  - The shared credentials and config files.
  - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` is set.
- - Amazon EC2 Instance profile credentials. 
- 
-You have also the possibility of using Profile Credentials Provider, by specifying the useProfileCredentialsProvider option to true and profileCredentialsName to the profile name.
-
-Only one of static, default and profile credentials could be used at the same time.
-
-For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]
-
-=== S3 Producer Operation examples
-
-- Single Upload: This operation will upload a file to S3 based on the body content
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camel.txt"))
-    .setBody(constant("Camel rocks!"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camel.txt</constant></setHeader>
-  <setBody><constant>Camel rocks!</constant></setBody>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camel.txt"
-        - setBody:
-            constant: "Camel rocks!"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will upload the file camel.txt with the content "Camel rocks!" in the _mycamelbucket_ bucket
-
-- Multipart Upload: This operation will perform a multipart upload of a file to S3 based on the body content
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("empty.txt"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&multiPartUpload=true&autoCreateBucket=true&partSize=1048576")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>empty.txt</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;multiPartUpload=true&amp;autoCreateBucket=true&amp;partSize=1048576"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "empty.txt"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              multiPartUpload: true
-              autoCreateBucket: true
-              partSize: 1048576
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will perform a multipart upload of the file empty.txt with based on the content the file src/empty.txt in the _mycamelbucket_ bucket
-
-- CopyObject: this operation copies an object from one bucket to a different one
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3BucketDestinationName", constant("camelDestinationBucket"))
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .setHeader("CamelAwsS3DestinationKey", constant("camelDestinationKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=copyObject")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3BucketDestinationName"><constant>camelDestinationBucket</constant></setHeader>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <setHeader name="CamelAwsS3DestinationKey"><constant>camelDestinationKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=copyObject"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3BucketDestinationName
-            constant: "camelDestinationBucket"
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - setHeader:
-            name: CamelAwsS3DestinationKey
-            constant: "camelDestinationKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: copyObject
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will copy the object with the name expressed in the header camelDestinationKey to the camelDestinationBucket bucket, from the bucket _mycamelbucket_.
-
-- DeleteObject: this operation deletes an object from a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObject")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteObject"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: deleteObject
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will delete the object camelKey from the bucket _mycamelbucket_.
-
-- ListBuckets: this operation lists the buckets for this account in this region
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listBuckets")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=listBuckets"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: listBuckets
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will list the buckets for this account
-
-- DeleteBucket: this operation deletes the bucket specified as URI parameter or header
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucket")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteBucket"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: deleteBucket
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will delete the bucket _mycamelbucket_
-
-- ListObjects: this operation list object in a specific bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=listObjects")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=listObjects"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: listObjects
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will list the objects in the _mycamelbucket_ bucket
-
-- GetObject: this operation gets a single object in a specific bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObject")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObject"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: getObject
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return an S3Object instance related to the camelKey object in _mycamelbucket_ bucket.
-
-- GetObjectRange: this operation gets a single object range in a specific bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .setHeader("CamelAwsS3RangeStart", constant("0"))
-    .setHeader("CamelAwsS3RangeEnd", constant("9"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectRange")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <setHeader name="CamelAwsS3RangeStart"><constant>0</constant></setHeader>
-  <setHeader name="CamelAwsS3RangeEnd"><constant>9</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObjectRange"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - setHeader:
-            name: CamelAwsS3RangeStart
-            constant: "0"
-        - setHeader:
-            name: CamelAwsS3RangeEnd
-            constant: "9"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: getObjectRange
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return an S3Object instance related to the camelKey object in _mycamelbucket_ bucket, containing the bytes from 0 to 9.
-
-- CreateDownloadLink: this operation will return a download link through S3 Presigner
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy&region=region&operation=createDownloadLink")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?accessKey=xxx&amp;secretKey=yyy&amp;region=region&amp;operation=createDownloadLink"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              accessKey: xxx
-              secretKey: yyy
-              region: region
-              operation: createDownloadLink
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return a download link url for the file camel-key in the bucket _mycamelbucket_ and region _region_.
-Parameters (`accessKey`, `secretKey` and `region`) are mandatory for this operation, if S3 client is autowired from the registry.
-
-NOTE: If checksum validations are enabled, the url will no longer be browser compatible because it adds a signed header that must be included in the HTTP request.
-
-- HeadBucket: this operation checks if a bucket exists and you have permission to access it
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=headBucket")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=headBucket"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: headBucket
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will check if the bucket _mycamelbucket_ exists and is accessible.
-
-- HeadObject: this operation retrieves metadata from an object without returning the object itself
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=headObject")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=headObject"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: headObject
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return metadata about the object camelKey in the bucket _mycamelbucket_.
-
-- DeleteObjects: this operation deletes multiple objects from a bucket in a single request
-
-NOTE: The `CamelAwsS3KeysToDelete` header requires a `List<String>` value, which must be set from a bean or processor.
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .process(exchange -> {
-        List<String> keys = List.of("key1", "key2", "key3");
-        exchange.getIn().setHeader("CamelAwsS3KeysToDelete", keys);
-    })
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjects")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <process ref="deleteKeysProcessor"/>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteObjects"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - process:
-            ref: deleteKeysProcessor
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: deleteObjects
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will delete the objects with keys key1, key2, and key3 from the bucket _mycamelbucket_.
-
-- CreateUploadLink: this operation will return an upload link through S3 Presigner
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy&region=region&operation=createUploadLink")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?accessKey=xxx&amp;secretKey=yyy&amp;region=region&amp;operation=createUploadLink"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              accessKey: xxx
-              secretKey: yyy
-              region: region
-              operation: createUploadLink
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return an upload link url for uploading to the bucket _mycamelbucket_.
-
-- RestoreObject: this operation restores an archived object from Glacier storage
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .setHeader("CamelAwsS3RestoreDays", constant(1))
-    .setHeader("CamelAwsS3RestoreTier", constant("Expedited"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=restoreObject")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <setHeader name="CamelAwsS3RestoreDays"><constant>1</constant></setHeader>
-  <setHeader name="CamelAwsS3RestoreTier"><constant>Expedited</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=restoreObject"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - setHeader:
-            name: CamelAwsS3RestoreDays
-            constant: 1
-        - setHeader:
-            name: CamelAwsS3RestoreTier
-            constant: "Expedited"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: restoreObject
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will restore the archived object camelKey from Glacier for 1 day using expedited retrieval.
-
-- GetObjectTagging: this operation retrieves the tags associated with an object
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectTagging")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObjectTagging"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: getObjectTagging
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return the tags for object camelKey in the bucket _mycamelbucket_.
-
-- PutObjectTagging: this operation sets tags on an object
-
-NOTE: The `CamelAwsS3ObjectTags` header requires a `Map<String, String>` value, which must be set from a bean or processor.
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .process(exchange -> {
-        Map<String, String> tags = Map.of("Environment", "Production", "Owner", "TeamA");
-        exchange.getIn().setHeader("CamelAwsS3Key", "camelKey");
-        exchange.getIn().setHeader("CamelAwsS3ObjectTags", tags);
-    })
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putObjectTagging")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <process ref="objectTagsProcessor"/>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=putObjectTagging"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - process:
-            ref: objectTagsProcessor
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: putObjectTagging
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will set tags on the object camelKey in the bucket _mycamelbucket_.
-
-- DeleteObjectTagging: this operation deletes all tags from an object
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjectTagging")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteObjectTagging"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: deleteObjectTagging
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will delete all tags from the object camelKey in the bucket _mycamelbucket_.
-
-- GetObjectAcl: this operation retrieves the access control list (ACL) for an object
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectAcl")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObjectAcl"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: getObjectAcl
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will return the ACL for object camelKey in the bucket _mycamelbucket_.
-
-- PutObjectAcl: this operation sets the access control list (ACL) for an object
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3Key", constant("camelKey"))
-    .setHeader("CamelAwsS3CannedAcl", constant("PublicRead"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putObjectAcl")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
-  <setHeader name="CamelAwsS3CannedAcl"><constant>PublicRead</constant></setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=putObjectAcl"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3Key
-            constant: "camelKey"
-        - setHeader:
-            name: CamelAwsS3CannedAcl
-            constant: "PublicRead"
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: putObjectAcl
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will set the ACL to public-read for object camelKey in the bucket _mycamelbucket_.
-
-- CreateBucket: this operation creates a new S3 bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mynewbucket?amazonS3Client=#amazonS3Client&operation=createBucket")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mynewbucket?amazonS3Client=#amazonS3Client&amp;operation=createBucket"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mynewbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: createBucket
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will create a new bucket named _mynewbucket_ in the configured region.
-
-- GetBucketTagging: this operation retrieves the tags associated with a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketTagging")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getBucketTagging"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: getBucketTagging
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will return the tags for the bucket _mycamelbucket_.
-
-- PutBucketTagging: this operation sets tags on a bucket
-
-NOTE: The `CamelAwsS3BucketTags` header requires a `Map<String, String>` value, which must be set from a bean or processor.
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .process(exchange -> {
-        Map<String, String> tags = Map.of("Project", "CamelIntegration", "CostCenter", "Engineering");
-        exchange.getIn().setHeader("CamelAwsS3BucketTags", tags);
-    })
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketTagging")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <process ref="bucketTagsProcessor"/>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=putBucketTagging"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - process:
-            ref: bucketTagsProcessor
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: putBucketTagging
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will set tags on the bucket _mycamelbucket_.
-
-- DeleteBucketTagging: this operation deletes all tags from a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucketTagging")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteBucketTagging"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: deleteBucketTagging
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will delete all tags from the bucket _mycamelbucket_.
-
-- GetBucketVersioning: this operation retrieves the versioning configuration of a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketVersioning")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getBucketVersioning"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: getBucketVersioning
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will return the versioning configuration for the bucket _mycamelbucket_.
-
-- PutBucketVersioning: this operation sets the versioning configuration of a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .setHeader("CamelAwsS3VersioningStatus", constant("Enabled"))
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketVersioning")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <setHeader name="CamelAwsS3VersioningStatus">
-    <constant>Enabled</constant>
-  </setHeader>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=putBucketVersioning"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - setHeader:
-            name: CamelAwsS3VersioningStatus
-            constant: Enabled
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: putBucketVersioning
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will enable versioning on the bucket _mycamelbucket_.
-
-- GetBucketPolicy: this operation retrieves the policy of a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketPolicy")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getBucketPolicy"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: getBucketPolicy
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will return the bucket policy for _mycamelbucket_ as a JSON string.
-
-- PutBucketPolicy: this operation sets the policy on a bucket
-
-NOTE: The `CamelAwsS3BucketPolicy` header requires a JSON policy string, which must be set from a bean or processor.
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:start")
-    .process(exchange -> {
-        String policy = """
-            {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", \
-            "Principal": "*", "Action": "s3:GetObject", \
-            "Resource": "arn:aws:s3:::mycamelbucket/*"}]}""";
-        exchange.getIn().setHeader("CamelAwsS3BucketPolicy", policy);
-    })
-    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketPolicy")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <process ref="bucketPolicyProcessor"/>
-  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=putBucketPolicy"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-      steps:
-        - process:
-            ref: bucketPolicyProcessor
-        - to:
-            uri: aws2-s3://mycamelbucket
-            parameters:
-              amazonS3Client: "#amazonS3Client"
-              operation: putBucketPolicy
-        - to:
-            uri: mock:result
-----
-====
-
-This operation will set a bucket policy on _mycamelbucket_.
-
-- DeleteBucketPolicy: this operation deletes the policy from a bucket
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("direct:start")
-  .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucketPolicy")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="direct:start"/>
-    <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=deleteBucketPolicy"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:start
-    steps:
-      - to:
-          uri: aws2-s3://mycamelbucket
-          parameters:
-            amazonS3Client: "#amazonS3Client"
-            operation: deleteBucketPolicy
-      - to:
-          uri: mock:result
-----
-====
-
-This operation will delete the bucket policy from _mycamelbucket_.
-
-=== AWS S3 Producer minimum permissions
-
-For making the producer work, you'll need at least PutObject and ListBuckets permissions. The following policy will be enough:
-
-[source,json]
-----
-{
-    "Version": "2012-10-17",
-    "Statement": [
-        {
-            "Effect": "Allow",
-            "Action": "s3:PutObject",
-            "Resource": "arn:aws:s3:::*/*"
-        },
-        {
-            "Effect": "Allow",
-            "Action": "s3:ListBucket",
-            "Resource": "arn:aws:s3:::*"
-        }
-    ]
-}
-----
-
-A variation to the minimum permissions is related to the usage of Bucket autocreation. In that case the permissions will need to be increased with CreateBucket permission
-
-[source,json]
-----
-{
-    "Version": "2012-10-17",
-    "Statement": [
-        {
-            "Effect": "Allow",
-            "Action": "s3:PutObject",
-            "Resource": "arn:aws:s3:::*/*"
-        },
-        {
-            "Effect": "Allow",
-            "Action": "s3:ListBucket",
-            "Resource": "arn:aws:s3:::*"
-        },
-        {
-            "Effect": "Allow",
-            "Action": "s3:CreateBucket",
-            "Resource": "arn:aws:s3:::*"
-        }
-    ]
-}
-----
-
-=== AWS S3 Consumer minimum permissions
-
-For making the producer work, you'll need at least GetObject, ListBuckets and DeleteObject permissions. The following policy will be enough:
-
-[source,json]
-----
-{
-    "Version": "2012-10-17",
-    "Statement": [
-        {
-            "Effect": "Allow",
-            "Action": "s3:ListBucket",
-            "Resource": "arn:aws:s3:::*"
-        },
-        {
-            "Effect": "Allow",
-            "Action": "s3:GetObject",
-            "Resource": "arn:aws:s3:::*/*"
-        },
-        {
-            "Effect": "Allow",
-            "Action": "s3:DeleteObject",
-            "Resource": "arn:aws:s3:::*/*"
-        }
-    ]
-}
-----
-
-By Default the consumer will use the deleteAfterRead option, this means the object will be deleted once consumed, this is why the DeleteObject permission is required.
-
-=== Streaming Upload mode
-
-With the stream mode enabled, users will be able to upload data to S3 without knowing ahead of time the dimension of the data, by leveraging multipart upload.
-The upload will be completed when the batchSize has been completed or the batchMessageNumber has been reached.
-There are two possible naming strategies: progressive and random.
-With the progressive strategy, each file will have the name composed by keyName option and a progressive counter, and eventually the file extension (if any), while with the random strategy a UUID will be added after keyName and eventually the file extension will be appended.
-
-Additionally, streaming upload mode supports timestamp-based file grouping, which allows messages to be automatically grouped into time windows based on their timestamps.
-
-As an example:
-
-._Java-only: Endpoint DSL builder style_
-
-[source,java]
-----
-from(kafka("topic1").brokers("localhost:9092"))
-        .log("Kafka Message is: ${body}")
-        .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
-                .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive)
-                .keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));
-
-from(kafka("topic2").brokers("localhost:9092"))
-         .log("Kafka Message is: ${body}")
-         .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
-                 .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.random)
-                 .keyName("{{kafkaTopic2}}/{{kafkaTopic2}}.txt"));
-----
-
-The default size for a batch is 1 Mb, but you can adjust it according to your requirements.
-
-When you stop your producer route, the producer will take care of flushing the remaining buffered message and complete the upload.
-
-In Streaming upload, you'll be able to restart the producer from the point where it left. It's important to note that this feature is critical only when using the progressive naming strategy.
-
-By setting the restartingPolicy to lastPart, you will restart uploading files and contents from the last part number the producer left.
-
-As example: 
- - Start the route with progressive naming strategy and keyname equals to camel.txt, with batchMessageNumber equals to 20, and restartingPolicy equals to lastPart
- - Send 70 messages.
- - Stop the route
- - On your S3 bucket you should now see four files: camel.txt, camel-1.txt, camel-2.txt and camel-3.txt, the first three will have 20 messages, while the last one is only 10.
- - Restart the route
- - Send 25 messages
- - Stop the route
- - You'll now have two other files in your bucket: camel-5.txt and camel-6.txt, the first with 20 messages and the second with 5 messages.
- - Go ahead
-
-This won't be needed when using the random naming strategy.
-
-On the opposite, you can specify the override restartingPolicy. In that case, you'll be able to override whatever you written before (for that particular keyName) in your bucket.
-
-[NOTE]
-====
-In Streaming upload mode, the only keyName option that will be taken into account is the endpoint option. Using the header will throw an NPE and this is done by design.
-Setting the header means potentially change the file name on each exchange, and this is against the aim of the streaming upload producer. The keyName needs to be fixed and static.
-The selected naming strategy will do the rest of the work.
-====
-
-Another possibility is specifying a streamingUploadTimeout with batchMessageNumber and batchSize options. With this option, the user will be able to complete the upload of a file after a certain time passed.
-In this way, the upload completion will be passed on three tiers: the timeout, the number of messages and the batch size.
-
-As an example:
-
-._Java-only: Endpoint DSL builder style_
-
-[source,java]
-----
-from(kafka("topic1").brokers("localhost:9092"))
-        .log("Kafka Message is: ${body}")
-        .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
-                .streamingUploadTimeout(10000)
-                .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive)
-                .keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));
-----
-
-In this case, the upload will be completed after 10 seconds.
-
-==== Timestamp Grouping
-
-The streaming upload mode also supports timestamp-based file grouping, which allows messages to be automatically grouped into time windows and written to the same S3 file based on their timestamps. This feature enables append-like behavior where messages with timestamps falling within the same time window are combined into a single file.
-
-To enable timestamp grouping, use the following configuration options:
-
-- `timestampGroupingEnabled`: Set to `true` to enable timestamp-based grouping (default: `false`)
-- `timestampWindowSizeMillis`: The size of the time window in milliseconds (default: `300000` = 5 minutes)
-- `timestampHeaderName`: The name of the message header containing the timestamp (default: `Exchange.MESSAGE_TIMESTAMP`)
-
-Messages are grouped based on their timestamps extracted from the specified header. The timestamp can be provided as:
-
-- Long: Unix timestamp in milliseconds
-- Date: Java Date object
-- String: String representation of Unix timestamp in milliseconds
-
-Files are automatically named using a timestamp-based pattern that includes the time window information.
-
-===== Example Configuration
-
-Basic timestamp grouping with 5-minute windows:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("timer:messages?period=10000")
-    .setHeader(Exchange.MESSAGE_TIMESTAMP, simple("${date:now:timestamp}"))
-    .setBody(constant("Message with timestamp"))
-    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=300000&keyName=grouped-messages.txt");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="timer:messages?period=10000"/>
-  <setHeader name="CamelMessageTimestamp">
-    <simple>${date:now:timestamp}</simple>
-  </setHeader>
-  <setBody>
-    <constant>Message with timestamp</constant>
-  </setBody>
-  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=300000&amp;keyName=grouped-messages.txt"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: timer:messages
-      parameters:
-        period: 10000
-      steps:
-        - setHeader:
-            name: CamelMessageTimestamp
-            simple: "${date:now:timestamp}"
-        - setBody:
-            constant: Message with timestamp
-        - to:
-            uri: aws2-s3://my-bucket
-            parameters:
-              streamingUploadMode: true
-              timestampGroupingEnabled: true
-              timestampWindowSizeMillis: 300000
-              keyName: grouped-messages.txt
-----
-====
-
-Custom window size (1 minute) with custom header name:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:timestamped")
-    .setHeader("MyTimestamp", simple("${date:now:timestamp}"))
-    .setBody(constant("Custom timestamped message"))
-    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=60000&timestampHeaderName=MyTimestamp&keyName=custom-grouped.txt");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:timestamped"/>
-  <setHeader name="MyTimestamp">
-    <simple>${date:now:timestamp}</simple>
-  </setHeader>
-  <setBody>
-    <constant>Custom timestamped message</constant>
-  </setBody>
-  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=60000&amp;timestampHeaderName=MyTimestamp&amp;keyName=custom-grouped.txt"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:timestamped
-      steps:
-        - setHeader:
-            name: MyTimestamp
-            simple: "${date:now:timestamp}"
-        - setBody:
-            constant: Custom timestamped message
-        - to:
-            uri: aws2-s3://my-bucket
-            parameters:
-              streamingUploadMode: true
-              timestampGroupingEnabled: true
-              timestampWindowSizeMillis: 60000
-              timestampHeaderName: MyTimestamp
-              keyName: custom-grouped.txt
-----
-====
-
-Large files with multipart and timestamp grouping:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("direct:large-timestamped")
-    .setHeader(Exchange.MESSAGE_TIMESTAMP, simple("${date:now:timestamp}"))
-    .setBody(constant("Large message content..."))
-    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=1800000&multiPartUpload=true&partSize=5242880&keyName=large-grouped.txt");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="direct:large-timestamped"/>
-  <setHeader name="CamelMessageTimestamp">
-    <simple>${date:now:timestamp}</simple>
-  </setHeader>
-  <setBody>
-    <constant>Large message content...</constant>
-  </setBody>
-  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=1800000&amp;multiPartUpload=true&amp;partSize=5242880&amp;keyName=large-grouped.txt"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: direct:large-timestamped
-      steps:
-        - setHeader:
-            name: CamelMessageTimestamp
-            simple: "${date:now:timestamp}"
-        - setBody:
-            constant: "Large message content..."
-        - to:
-            uri: aws2-s3://my-bucket
-            parameters:
-              streamingUploadMode: true
-              timestampGroupingEnabled: true
-              timestampWindowSizeMillis: 1800000
-              multiPartUpload: true
-              partSize: 5242880
-              keyName: large-grouped.txt
-----
-====
-
-===== File Naming
-
-Files are automatically named using the following pattern:
-```
-{baseFileName}_{YYYYMMDD}_{HHMM}_{HHMM-HHMM}.{extension}
-```
-
-For time windows smaller than 1 minute, seconds precision is used:
-```
-{baseFileName}_{YYYYMMDD}_{HHMMSS}_{HHMMSS-HHMMSS}.{extension}
-```
-
-Example file names:
-- 5-minute window: `messages_20240101_0800_0800-0805.txt`
-- 1-minute window: `data_20240315_1430_1430-1431.log`
-- 5-second window: `events_20241225_000000_000000-000005.json`
+ - Amazon EC2 Instance profile credentials.
 
-===== Time Window Examples
-
-With a 5-minute window (300000ms):
-- Window 1: 08:00:00 - 08:04:59 → `file_20240101_0800_0800-0805.txt`
-- Window 2: 08:05:00 - 08:09:59 → `file_20240101_0805_0805-0810.txt`
-- Window 3: 08:10:00 - 08:14:59 → `file_20240101_0810_0810-0815.txt`
-
-===== Fallback Behavior
-
-- If no timestamp header is found, the current system time is used
-- If the timestamp header contains invalid data, the current system time is used
-- Warning messages are logged when fallback behavior occurs
+You have also the possibility of using Profile Credentials Provider, by specifying the useProfileCredentialsProvider option to true and profileCredentialsName to the profile name.
 
-===== Performance Considerations
+Only one of static, default and profile credentials could be used at the same time.
 
-- Multiple concurrent time windows are supported
-- Each window maintains its own upload state
-- Memory usage scales with the number of active time windows
-- Completed windows are automatically cleaned up
-- Works with all existing streaming upload features (multipart uploads, timeouts, etc.)
+For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]
 
 === Bucket Auto-creation
 
@@ -2085,315 +265,6 @@ Some users like to consume stuff from a bucket and move the content in a differe
 If this is case for you, remember to remove the bucketName header from the incoming exchange of the consumer, otherwise the file will always be overwritten on the same
 original bucket.
 
-=== MoveAfterRead consumer option
-
-In addition to deleteAfterRead, it has been added another option, moveAfterRead. With this option enabled, the consumed object will be moved to a target destinationBucket instead of being only deleted.
-This will require specifying the destinationBucket option. As example:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        moveAfterRead: true
-        destinationBucket: myothercamelbucket
-    steps:
-      - to:
-          uri: mock:result
-----
-====
-
-In this case, the objects consumed will be moved to _myothercamelbucket_ bucket and deleted from the original one (because of deleteAfterRead set to true as default).
-
-You have also the possibility of using a key prefix/suffix while moving the file to a different bucket.
-The options are `destinationBucketPrefix` and `destinationBucketSuffix`.
-
-Both options support the xref:languages:simple-language.adoc[Simple] expression language.
-Wrap an expression in `RAW()` to prevent the Camel URI parser from interpreting special characters:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(pre-)&destinationBucketSuffix=RAW(-suff)")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(pre-)&amp;destinationBucketSuffix=RAW(-suff)"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        moveAfterRead: true
-        destinationBucket: myothercamelbucket
-        destinationBucketPrefix: "RAW(pre-)"
-        destinationBucketSuffix: "RAW(-suff)"
-      steps:
-        - to:
-            uri: mock:result
-----
-====
-
-In this case, an object named `test` is moved to `myothercamelbucket` with the key `pre-test-suff`.
-
-Using a Simple expression, you can build dynamic paths at runtime.
-The following example organises moved objects by date:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)")
-    .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)"/>
-  <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        moveAfterRead: true
-        destinationBucket: myothercamelbucket
-        destinationBucketPrefix: "RAW(${date:now:yyyy/MM/dd}/)"
-      steps:
-        - to:
-            uri: mock:result
-----
-====
-
-An object named `report.csv` consumed on 2026-05-19 is moved with the key `2026/05/19/report.csv`.
-Expressions are evaluated once per exchange, so each message can produce a different destination key.
-
-=== Additional Consumer Examples
-
-=== Consumer with prefix filtering
-
-You can configure the consumer to only process objects with a specific prefix:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&prefix=processed/&delay=30000")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;prefix=processed/&amp;delay=30000"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        prefix: processed/
-        delay: 30000
-    steps:
-      - to:
-          uri: mock:result
-----
-====
-
-This will only consume objects that start with "processed/" prefix from the _mycamelbucket_ bucket, with a 30-second polling delay.
-
-=== Consumer with custom polling and batch settings
-
-Configure custom polling intervals and batch sizes:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&delay=60000&maxMessagesPerPoll=5&includeBody=false")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;delay=60000&amp;maxMessagesPerPoll=5&amp;includeBody=false"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        delay: 60000
-        maxMessagesPerPoll: 5
-        includeBody: false
-    steps:
-      - to:
-          uri: mock:result
-----
-====
-
-This consumer polls every 60 seconds, processes up to 5 objects per poll, and doesn't include the object body in the message (only metadata).
-
-=== Consumer with file filtering and no deletion
-
-Configure the consumer to not delete files after reading and include specific file patterns:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&deleteAfterRead=false&fileName=*.pdf")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;deleteAfterRead=false&amp;fileName=*.pdf"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        deleteAfterRead: false
-        fileName: "*.pdf"
-    steps:
-      - to:
-          uri: mock:result
-----
-====
-
-This consumer will read PDF files but won't delete them after processing.
-
-=== Consumer with done file pattern
-
-Use a done file pattern to ensure files are completely uploaded before processing:
-
-[tabs]
-====
-Java::
-+
-[source,java]
-----
-  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&doneFileName=*.done")
-  .to("mock:result");
-----
-
-XML::
-+
-[source,xml]
-----
-<route>
-    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;doneFileName=*.done"/>
-    <to uri="mock:result"/>
-</route>
-----
-
-YAML::
-+
-[source,yaml]
-----
-- route:
-    from:
-      uri: aws2-s3://mycamelbucket
-      parameters:
-        amazonS3Client: "#amazonS3Client"
-        doneFileName: "*.done"
-    steps:
-      - to:
-          uri: mock:result
-----
-====
-
-This consumer will only process files when a corresponding .done file exists in the bucket.
-
 === Using the customer key as encryption
 
 We introduced also the customer key support (an alternative of using KMS). The following code shows an example.
@@ -2494,6 +365,14 @@ configuration.setUriEndpointOverride("http://ecs1.emc.com:9020");
 
 For more details see https://www.dell.com/support/manuals/en-us/ecs-appliance-/ecs_pub_data_access_guide_3_3_to_3_6/using-the-java-amazon-sdk?guid=guid-149be134-6938-4cd7-9503-cf3ca9d23261&lang=en-us[their documentation].
 
+== Sub-Pages
+
+For more details on specific features, see:
+
+* xref:others:aws2-s3-producer-operations.adoc[Producer Operations] - All producer operation examples with minimum IAM permissions
+* xref:others:aws2-s3-streaming.adoc[Streaming Upload] - Streaming upload mode, naming strategies, and timestamp grouping
+* xref:others:aws2-s3-consumer-examples.adoc[Consumer Examples] - Consumer patterns including prefix filtering, polling strategies, and done files
+
 == Dependencies
 
 Maven users will need to add the following dependency to their pom.xml.
@@ -2511,4 +390,3 @@ Maven users will need to add the following dependency to their pom.xml.
 
 where `$\{camel-version}` must be replaced by the actual version of Camel.
 
-
diff --git a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-consumer-examples.adoc b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-consumer-examples.adoc
new file mode 100644
index 000000000000..ab28ca5d7e6d
--- /dev/null
+++ b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-consumer-examples.adoc
@@ -0,0 +1,313 @@
+= AWS S3 - Consumer Examples
+:tabs-sync-option:
+
+xref:ROOT:aws2-s3-component.adoc[Back to AWS S3 Component]
+
+== MoveAfterRead consumer option
+
+In addition to deleteAfterRead, it has been added another option, moveAfterRead. With this option enabled, the consumed object will be moved to a target destinationBucket instead of being only deleted.
+This will require specifying the destinationBucket option. As example:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket")
+  .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        moveAfterRead: true
+        destinationBucket: myothercamelbucket
+    steps:
+      - to:
+          uri: mock:result
+----
+====
+
+In this case, the objects consumed will be moved to _myothercamelbucket_ bucket and deleted from the original one (because of deleteAfterRead set to true as default).
+
+You have also the possibility of using a key prefix/suffix while moving the file to a different bucket.
+The options are `destinationBucketPrefix` and `destinationBucketSuffix`.
+
+Both options support the xref:languages:simple-language.adoc[Simple] expression language.
+Wrap an expression in `RAW()` to prevent the Camel URI parser from interpreting special characters:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(pre-)&destinationBucketSuffix=RAW(-suff)")
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(pre-)&amp;destinationBucketSuffix=RAW(-suff)"/>
+  <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        moveAfterRead: true
+        destinationBucket: myothercamelbucket
+        destinationBucketPrefix: "RAW(pre-)"
+        destinationBucketSuffix: "RAW(-suff)"
+      steps:
+        - to:
+            uri: mock:result
+----
+====
+
+In this case, an object named `test` is moved to `myothercamelbucket` with the key `pre-test-suff`.
+
+Using a Simple expression, you can build dynamic paths at runtime.
+The following example organises moved objects by date:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)")
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)"/>
+  <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        moveAfterRead: true
+        destinationBucket: myothercamelbucket
+        destinationBucketPrefix: "RAW(${date:now:yyyy/MM/dd}/)"
+      steps:
+        - to:
+            uri: mock:result
+----
+====
+
+An object named `report.csv` consumed on 2026-05-19 is moved with the key `2026/05/19/report.csv`.
+Expressions are evaluated once per exchange, so each message can produce a different destination key.
+
+== Additional Consumer Examples
+
+== Consumer with prefix filtering
+
+You can configure the consumer to only process objects with a specific prefix:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&prefix=processed/&delay=30000")
+  .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;prefix=processed/&amp;delay=30000"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        prefix: processed/
+        delay: 30000
+    steps:
+      - to:
+          uri: mock:result
+----
+====
+
+This will only consume objects that start with "processed/" prefix from the _mycamelbucket_ bucket, with a 30-second polling delay.
+
+== Consumer with custom polling and batch settings
+
+Configure custom polling intervals and batch sizes:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&delay=60000&maxMessagesPerPoll=5&includeBody=false")
+  .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;delay=60000&amp;maxMessagesPerPoll=5&amp;includeBody=false"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        delay: 60000
+        maxMessagesPerPoll: 5
+        includeBody: false
+    steps:
+      - to:
+          uri: mock:result
+----
+====
+
+This consumer polls every 60 seconds, processes up to 5 objects per poll, and doesn't include the object body in the message (only metadata).
+
+== Consumer with file filtering and no deletion
+
+Configure the consumer to not delete files after reading and include specific file patterns:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&deleteAfterRead=false&fileName=*.pdf")
+  .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;deleteAfterRead=false&amp;fileName=*.pdf"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        deleteAfterRead: false
+        fileName: "*.pdf"
+    steps:
+      - to:
+          uri: mock:result
+----
+====
+
+This consumer will read PDF files but won't delete them after processing.
+
+== Consumer with done file pattern
+
+Use a done file pattern to ensure files are completely uploaded before processing:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&doneFileName=*.done")
+  .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;doneFileName=*.done"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: aws2-s3://mycamelbucket
+      parameters:
+        amazonS3Client: "#amazonS3Client"
+        doneFileName: "*.done"
+    steps:
+      - to:
+          uri: mock:result
+----
+====
+
+This consumer will only process files when a corresponding .done file exists in the bucket.
diff --git a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-producer-operations.adoc b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-producer-operations.adoc
new file mode 100644
index 000000000000..95555e621ed1
--- /dev/null
+++ b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-producer-operations.adoc
@@ -0,0 +1,478 @@
+= AWS S3 - Producer Operations
+:tabs-sync-option:
+
+xref:ROOT:aws2-s3-component.adoc[Back to AWS S3 Component]
+
+== Common Pattern
+
+Most producer operations follow the same pattern: set the `operation` parameter on the endpoint URI,
+optionally set a key via the `CamelAwsS3Key` header, and send the exchange.
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("camelKey"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObject")
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
+  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=getObject"/>
+  <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - setHeader:
+            name: CamelAwsS3Key
+            constant: "camelKey"
+        - to:
+            uri: aws2-s3://mycamelbucket
+            parameters:
+              amazonS3Client: "#amazonS3Client"
+              operation: getObject
+        - to:
+            uri: mock:result
+----
+====
+
+Bucket-level operations (`listBuckets`, `deleteBucket`, `listObjects`, `createBucket`, etc.)
+don't require a key header — just set the `operation` parameter.
+
+== Operations Reference
+
+[width="100%",cols="3,5,3",options="header"]
+|===
+| Operation | Description | Notes
+
+| `listBuckets`
+| List all buckets for this account in this region.
+|
+
+| `createBucket`
+| Create a new bucket.
+|
+
+| `deleteBucket`
+| Delete a bucket.
+|
+
+| `headBucket`
+| Check if a bucket exists and you have permission to access it.
+|
+
+| `listObjects`
+| List objects in a bucket.
+|
+
+| `getObject`
+| Get a single object. Returns an `S3Object` instance.
+|
+
+| `getObjectRange`
+| Get a byte range from an object.
+| See <<getObjectRange>>
+
+| `deleteObject`
+| Delete an object.
+|
+
+| `deleteObjects`
+| Delete multiple objects in a single request.
+| See <<deleteObjects>>
+
+| `copyObject`
+| Copy an object from one bucket to another.
+| See <<copyObject>>
+
+| `headObject`
+| Retrieve metadata from an object without returning the object itself.
+|
+
+| `uploadObject` (default)
+| Upload a file to S3 based on the body content.
+| See <<uploadObject>>
+
+| `multipartUpload`
+| Upload a large file using multipart upload.
+| See <<multipartUpload>>
+
+| `createDownloadLink`
+| Generate a presigned download URL.
+| See <<createDownloadLink>>
+
+| `createUploadLink`
+| Generate a presigned upload URL.
+| Requires `accessKey`, `secretKey`, `region`
+
+| `restoreObject`
+| Restore an archived object from Glacier storage.
+| See <<restoreObject>>
+
+| `getObjectTagging`
+| Get the tags of an object.
+|
+
+| `putObjectTagging`
+| Set tags on an object.
+| Requires `Map<String, String>` via `CamelAwsS3ObjectTags` header
+
+| `deleteObjectTagging`
+| Delete all tags from an object.
+|
+
+| `getObjectAcl`
+| Get the ACL of an object.
+|
+
+| `putObjectAcl`
+| Set the ACL on an object.
+| Use `CamelAwsS3CannedAcl` header (e.g., `PublicRead`)
+
+| `getBucketTagging`
+| Get the tags of a bucket.
+|
+
+| `putBucketTagging`
+| Set tags on a bucket.
+| Requires `Map<String, String>` via `CamelAwsS3BucketTags` header
+
+| `deleteBucketTagging`
+| Delete all tags from a bucket.
+|
+
+| `getBucketVersioning`
+| Get the versioning configuration of a bucket.
+|
+
+| `putBucketVersioning`
+| Set the versioning configuration of a bucket.
+| Use `CamelAwsS3VersioningStatus` header (`Enabled` or `Suspended`)
+
+| `getBucketPolicy`
+| Get the bucket policy as a JSON string.
+|
+
+| `putBucketPolicy`
+| Set a bucket policy.
+| See <<putBucketPolicy>>
+
+| `deleteBucketPolicy`
+| Delete the bucket policy.
+|
+|===
+
+== Operation Details
+
+This section covers operations that require special configuration beyond the common pattern.
+
+[[uploadObject]]
+=== Upload (Single Upload)
+
+Upload a file to S3 based on the body content:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("camel.txt"))
+    .setBody(constant("Camel rocks!"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client")
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <setHeader name="CamelAwsS3Key"><constant>camel.txt</constant></setHeader>
+  <setBody><constant>Camel rocks!</constant></setBody>
+  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client"/>
+  <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - setHeader:
+            name: CamelAwsS3Key
+            constant: "camel.txt"
+        - setBody:
+            constant: "Camel rocks!"
+        - to:
+            uri: aws2-s3://mycamelbucket
+            parameters:
+              amazonS3Client: "#amazonS3Client"
+        - to:
+            uri: mock:result
+----
+====
+
+[[multipartUpload]]
+=== Multipart Upload
+
+For large files, use multipart upload with configurable part size:
+
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("large-file.txt"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&multiPartUpload=true&autoCreateBucket=true&partSize=1048576")
+    .to("mock:result");
+----
+
+[[copyObject]]
+=== copyObject
+
+Copy an object between buckets using destination headers:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3BucketDestinationName", constant("camelDestinationBucket"))
+    .setHeader("CamelAwsS3Key", constant("camelKey"))
+    .setHeader("CamelAwsS3DestinationKey", constant("camelDestinationKey"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=copyObject")
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <setHeader name="CamelAwsS3BucketDestinationName"><constant>camelDestinationBucket</constant></setHeader>
+  <setHeader name="CamelAwsS3Key"><constant>camelKey</constant></setHeader>
+  <setHeader name="CamelAwsS3DestinationKey"><constant>camelDestinationKey</constant></setHeader>
+  <to uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;operation=copyObject"/>
+  <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - setHeader:
+            name: CamelAwsS3BucketDestinationName
+            constant: "camelDestinationBucket"
+        - setHeader:
+            name: CamelAwsS3Key
+            constant: "camelKey"
+        - setHeader:
+            name: CamelAwsS3DestinationKey
+            constant: "camelDestinationKey"
+        - to:
+            uri: aws2-s3://mycamelbucket
+            parameters:
+              amazonS3Client: "#amazonS3Client"
+              operation: copyObject
+        - to:
+            uri: mock:result
+----
+====
+
+This copies the object `camelKey` from `mycamelbucket` to `camelDestinationBucket` with the key `camelDestinationKey`.
+
+[[getObjectRange]]
+=== getObjectRange
+
+Download a specific byte range from an object using the `CamelAwsS3RangeStart` and `CamelAwsS3RangeEnd` headers:
+
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("camelKey"))
+    .setHeader("CamelAwsS3RangeStart", constant("0"))
+    .setHeader("CamelAwsS3RangeEnd", constant("9"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectRange")
+    .to("mock:result");
+----
+
+This returns the first 10 bytes (0 to 9) of the object.
+
+[[createDownloadLink]]
+=== createDownloadLink
+
+Generate a presigned download URL. Parameters `accessKey`, `secretKey`, and `region` are mandatory
+for this operation if the S3 client is autowired from the registry:
+
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("camelKey"))
+    .to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy&region=region&operation=createDownloadLink")
+    .to("mock:result");
+----
+
+NOTE: If checksum validations are enabled, the URL will no longer be browser compatible because it adds a signed header that must be included in the HTTP request.
+
+The same pattern applies to `createUploadLink`.
+
+[[deleteObjects]]
+=== deleteObjects
+
+Delete multiple objects in a single request. Requires a `List<String>` of keys via the `CamelAwsS3KeysToDelete` header:
+
+[source,java]
+----
+from("direct:start")
+    .process(exchange -> {
+        List<String> keys = List.of("key1", "key2", "key3");
+        exchange.getIn().setHeader("CamelAwsS3KeysToDelete", keys);
+    })
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjects")
+    .to("mock:result");
+----
+
+[[restoreObject]]
+=== restoreObject
+
+Restore an archived object from Glacier storage:
+
+[source,java]
+----
+from("direct:start")
+    .setHeader("CamelAwsS3Key", constant("camelKey"))
+    .setHeader("CamelAwsS3RestoreDays", constant(1))
+    .setHeader("CamelAwsS3RestoreTier", constant("Expedited"))
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=restoreObject")
+    .to("mock:result");
+----
+
+[[putBucketPolicy]]
+=== putBucketPolicy
+
+Set a bucket policy using a JSON policy string via the `CamelAwsS3BucketPolicy` header:
+
+[source,java]
+----
+from("direct:start")
+    .process(exchange -> {
+        String policy = """
+            {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", \
+            "Principal": "*", "Action": "s3:GetObject", \
+            "Resource": "arn:aws:s3:::mycamelbucket/*"}]}""";
+        exchange.getIn().setHeader("CamelAwsS3BucketPolicy", policy);
+    })
+    .to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketPolicy")
+    .to("mock:result");
+----
+
+== Minimum IAM Permissions
+
+=== Producer
+
+For making the producer work, you'll need at least PutObject and ListBuckets permissions:
+
+[source,json]
+----
+{
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Effect": "Allow",
+            "Action": "s3:PutObject",
+            "Resource": "arn:aws:s3:::*/*"
+        },
+        {
+            "Effect": "Allow",
+            "Action": "s3:ListBucket",
+            "Resource": "arn:aws:s3:::*"
+        }
+    ]
+}
+----
+
+If using bucket auto-creation, add the CreateBucket permission:
+
+[source,json]
+----
+{
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Effect": "Allow",
+            "Action": "s3:PutObject",
+            "Resource": "arn:aws:s3:::*/*"
+        },
+        {
+            "Effect": "Allow",
+            "Action": "s3:ListBucket",
+            "Resource": "arn:aws:s3:::*"
+        },
+        {
+            "Effect": "Allow",
+            "Action": "s3:CreateBucket",
+            "Resource": "arn:aws:s3:::*"
+        }
+    ]
+}
+----
+
+=== Consumer
+
+For making the consumer work, you'll need at least GetObject, ListBucket, and DeleteObject permissions:
+
+[source,json]
+----
+{
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Effect": "Allow",
+            "Action": "s3:ListBucket",
+            "Resource": "arn:aws:s3:::*"
+        },
+        {
+            "Effect": "Allow",
+            "Action": "s3:GetObject",
+            "Resource": "arn:aws:s3:::*/*"
+        },
+        {
+            "Effect": "Allow",
+            "Action": "s3:DeleteObject",
+            "Resource": "arn:aws:s3:::*/*"
+        }
+    ]
+}
+----
+
+By default, the consumer uses the `deleteAfterRead` option, meaning the object will be deleted once consumed, which is why the `DeleteObject` permission is required.
diff --git a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-streaming.adoc b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-streaming.adoc
new file mode 100644
index 000000000000..1c9258dc10cb
--- /dev/null
+++ b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-streaming.adoc
@@ -0,0 +1,303 @@
+= AWS S3 - Streaming Upload
+:tabs-sync-option:
+
+xref:ROOT:aws2-s3-component.adoc[Back to AWS S3 Component]
+
+== Streaming Upload mode
+
+With the stream mode enabled, users will be able to upload data to S3 without knowing ahead of time the dimension of the data, by leveraging multipart upload.
+The upload will be completed when the batchSize has been completed or the batchMessageNumber has been reached.
+There are two possible naming strategies: progressive and random.
+With the progressive strategy, each file will have the name composed by keyName option and a progressive counter, and eventually the file extension (if any), while with the random strategy a UUID will be added after keyName and eventually the file extension will be appended.
+
+Additionally, streaming upload mode supports timestamp-based file grouping, which allows messages to be automatically grouped into time windows based on their timestamps.
+
+As an example:
+
+._Java-only: Endpoint DSL builder style_
+
+[source,java]
+----
+from(kafka("topic1").brokers("localhost:9092"))
+        .log("Kafka Message is: ${body}")
+        .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
+                .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive)
+                .keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));
+
+from(kafka("topic2").brokers("localhost:9092"))
+         .log("Kafka Message is: ${body}")
+         .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
+                 .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.random)
+                 .keyName("{{kafkaTopic2}}/{{kafkaTopic2}}.txt"));
+----
+
+The default size for a batch is 1 Mb, but you can adjust it according to your requirements.
+
+When you stop your producer route, the producer will take care of flushing the remaining buffered message and complete the upload.
+
+In Streaming upload, you'll be able to restart the producer from the point where it left. It's important to note that this feature is critical only when using the progressive naming strategy.
+
+By setting the restartingPolicy to lastPart, you will restart uploading files and contents from the last part number the producer left.
+
+As example:
+ - Start the route with progressive naming strategy and keyname equals to camel.txt, with batchMessageNumber equals to 20, and restartingPolicy equals to lastPart
+ - Send 70 messages.
+ - Stop the route
+ - On your S3 bucket you should now see four files: camel.txt, camel-1.txt, camel-2.txt and camel-3.txt, the first three will have 20 messages, while the last one is only 10.
+ - Restart the route
+ - Send 25 messages
+ - Stop the route
+ - You'll now have two other files in your bucket: camel-5.txt and camel-6.txt, the first with 20 messages and the second with 5 messages.
+ - Go ahead
+
+This won't be needed when using the random naming strategy.
+
+On the opposite, you can specify the override restartingPolicy. In that case, you'll be able to override whatever you written before (for that particular keyName) in your bucket.
+
+[NOTE]
+====
+In Streaming upload mode, the only keyName option that will be taken into account is the endpoint option. Using the header will throw an NPE and this is done by design.
+Setting the header means potentially change the file name on each exchange, and this is against the aim of the streaming upload producer. The keyName needs to be fixed and static.
+The selected naming strategy will do the rest of the work.
+====
+
+Another possibility is specifying a streamingUploadTimeout with batchMessageNumber and batchSize options. With this option, the user will be able to complete the upload of a file after a certain time passed.
+In this way, the upload completion will be passed on three tiers: the timeout, the number of messages and the batch size.
+
+As an example:
+
+._Java-only: Endpoint DSL builder style_
+
+[source,java]
+----
+from(kafka("topic1").brokers("localhost:9092"))
+        .log("Kafka Message is: ${body}")
+        .to(aws2S3("camel-bucket").streamingUploadMode(true).batchMessageNumber(25)
+                .streamingUploadTimeout(10000)
+                .namingStrategy(AWS2S3EndpointBuilderFactory.AWSS3NamingStrategyEnum.progressive)
+                .keyName("{{kafkaTopic1}}/{{kafkaTopic1}}.txt"));
+----
+
+In this case, the upload will be completed after 10 seconds.
+
+=== Timestamp Grouping
+
+The streaming upload mode also supports timestamp-based file grouping, which allows messages to be automatically grouped into time windows and written to the same S3 file based on their timestamps. This feature enables append-like behavior where messages with timestamps falling within the same time window are combined into a single file.
+
+To enable timestamp grouping, use the following configuration options:
+
+- `timestampGroupingEnabled`: Set to `true` to enable timestamp-based grouping (default: `false`)
+- `timestampWindowSizeMillis`: The size of the time window in milliseconds (default: `300000` = 5 minutes)
+- `timestampHeaderName`: The name of the message header containing the timestamp (default: `Exchange.MESSAGE_TIMESTAMP`)
+
+Messages are grouped based on their timestamps extracted from the specified header. The timestamp can be provided as:
+
+- Long: Unix timestamp in milliseconds
+- Date: Java Date object
+- String: String representation of Unix timestamp in milliseconds
+
+Files are automatically named using a timestamp-based pattern that includes the time window information.
+
+==== Example Configuration
+
+Basic timestamp grouping with 5-minute windows:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("timer:messages?period=10000")
+    .setHeader(Exchange.MESSAGE_TIMESTAMP, simple("${date:now:timestamp}"))
+    .setBody(constant("Message with timestamp"))
+    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=300000&keyName=grouped-messages.txt");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="timer:messages?period=10000"/>
+  <setHeader name="CamelMessageTimestamp">
+    <simple>${date:now:timestamp}</simple>
+  </setHeader>
+  <setBody>
+    <constant>Message with timestamp</constant>
+  </setBody>
+  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=300000&amp;keyName=grouped-messages.txt"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: timer:messages
+      parameters:
+        period: 10000
+      steps:
+        - setHeader:
+            name: CamelMessageTimestamp
+            simple: "${date:now:timestamp}"
+        - setBody:
+            constant: Message with timestamp
+        - to:
+            uri: aws2-s3://my-bucket
+            parameters:
+              streamingUploadMode: true
+              timestampGroupingEnabled: true
+              timestampWindowSizeMillis: 300000
+              keyName: grouped-messages.txt
+----
+====
+
+Custom window size (1 minute) with custom header name:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:timestamped")
+    .setHeader("MyTimestamp", simple("${date:now:timestamp}"))
+    .setBody(constant("Custom timestamped message"))
+    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=60000&timestampHeaderName=MyTimestamp&keyName=custom-grouped.txt");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="direct:timestamped"/>
+  <setHeader name="MyTimestamp">
+    <simple>${date:now:timestamp}</simple>
+  </setHeader>
+  <setBody>
+    <constant>Custom timestamped message</constant>
+  </setBody>
+  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=60000&amp;timestampHeaderName=MyTimestamp&amp;keyName=custom-grouped.txt"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:timestamped
+      steps:
+        - setHeader:
+            name: MyTimestamp
+            simple: "${date:now:timestamp}"
+        - setBody:
+            constant: Custom timestamped message
+        - to:
+            uri: aws2-s3://my-bucket
+            parameters:
+              streamingUploadMode: true
+              timestampGroupingEnabled: true
+              timestampWindowSizeMillis: 60000
+              timestampHeaderName: MyTimestamp
+              keyName: custom-grouped.txt
+----
+====
+
+Large files with multipart and timestamp grouping:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:large-timestamped")
+    .setHeader(Exchange.MESSAGE_TIMESTAMP, simple("${date:now:timestamp}"))
+    .setBody(constant("Large message content..."))
+    .to("aws2-s3://my-bucket?streamingUploadMode=true&timestampGroupingEnabled=true&timestampWindowSizeMillis=1800000&multiPartUpload=true&partSize=5242880&keyName=large-grouped.txt");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+  <from uri="direct:large-timestamped"/>
+  <setHeader name="CamelMessageTimestamp">
+    <simple>${date:now:timestamp}</simple>
+  </setHeader>
+  <setBody>
+    <constant>Large message content...</constant>
+  </setBody>
+  <to uri="aws2-s3://my-bucket?streamingUploadMode=true&amp;timestampGroupingEnabled=true&amp;timestampWindowSizeMillis=1800000&amp;multiPartUpload=true&amp;partSize=5242880&amp;keyName=large-grouped.txt"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:large-timestamped
+      steps:
+        - setHeader:
+            name: CamelMessageTimestamp
+            simple: "${date:now:timestamp}"
+        - setBody:
+            constant: "Large message content..."
+        - to:
+            uri: aws2-s3://my-bucket
+            parameters:
+              streamingUploadMode: true
+              timestampGroupingEnabled: true
+              timestampWindowSizeMillis: 1800000
+              multiPartUpload: true
+              partSize: 5242880
+              keyName: large-grouped.txt
+----
+====
+
+==== File Naming
+
+Files are automatically named using the following pattern:
+```
+{baseFileName}_{YYYYMMDD}_{HHMM}_{HHMM-HHMM}.{extension}
+```
+
+For time windows smaller than 1 minute, seconds precision is used:
+```
+{baseFileName}_{YYYYMMDD}_{HHMMSS}_{HHMMSS-HHMMSS}.{extension}
+```
+
+Example file names:
+- 5-minute window: `messages_20240101_0800_0800-0805.txt`
+- 1-minute window: `data_20240315_1430_1430-1431.log`
+- 5-second window: `events_20241225_000000_000000-000005.json`
+
+==== Time Window Examples
+
+With a 5-minute window (300000ms):
+- Window 1: 08:00:00 - 08:04:59 → `file_20240101_0800_0800-0805.txt`
+- Window 2: 08:05:00 - 08:09:59 → `file_20240101_0805_0805-0810.txt`
+- Window 3: 08:10:00 - 08:14:59 → `file_20240101_0810_0810-0815.txt`
+
+==== Fallback Behavior
+
+- If no timestamp header is found, the current system time is used
+- If the timestamp header contains invalid data, the current system time is used
+- Warning messages are logged when fallback behavior occurs
+
+==== Performance Considerations
+
+- Multiple concurrent time windows are supported
+- Each window maintains its own upload state
+- Memory usage scales with the number of active time windows
+- Completed windows are automatically cleaned up
+- Works with all existing streaming upload features (multipart uploads, timeouts, etc.)
diff --git a/docs/components/modules/others/nav.adoc b/docs/components/modules/others/nav.adoc
index e8ea5aefaa88..95d278de07c6 100644
--- a/docs/components/modules/others/nav.adoc
+++ b/docs/components/modules/others/nav.adoc
@@ -3,6 +3,9 @@
 
 * xref:others:index.adoc[Miscellaneous Components]
 ** xref:attachments.adoc[Attachments]
+** xref:aws2-s3-consumer-examples.adoc[AWS S3 - Consumer Examples]
+** xref:aws2-s3-producer-operations.adoc[AWS S3 - Producer Operations]
+** xref:aws2-s3-streaming.adoc[AWS S3 - Streaming Upload]
 *** xref:azure-schema-registry.adoc[Azure Schema Registry]
 ** xref:camel-yaml-dsl-validator-maven-plugin.adoc[Camel YAML DSL Validator Maven Plugin]
 ** xref:cli-connector.adoc[CLI Connector]
diff --git a/docs/components/modules/others/pages/aws2-s3-consumer-examples.adoc b/docs/components/modules/others/pages/aws2-s3-consumer-examples.adoc
new file mode 120000
index 000000000000..e9a449c1c7ca
--- /dev/null
+++ b/docs/components/modules/others/pages/aws2-s3-consumer-examples.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-consumer-examples.adoc
\ No newline at end of file
diff --git a/docs/components/modules/others/pages/aws2-s3-producer-operations.adoc b/docs/components/modules/others/pages/aws2-s3-producer-operations.adoc
new file mode 120000
index 000000000000..c24b69800957
--- /dev/null
+++ b/docs/components/modules/others/pages/aws2-s3-producer-operations.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-producer-operations.adoc
\ No newline at end of file
diff --git a/docs/components/modules/others/pages/aws2-s3-streaming.adoc b/docs/components/modules/others/pages/aws2-s3-streaming.adoc
new file mode 120000
index 000000000000..686c3b7a21f7
--- /dev/null
+++ b/docs/components/modules/others/pages/aws2-s3-streaming.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-streaming.adoc
\ No newline at end of file