

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Trabalhe com Amazon S3 URLs pré-assinados
<a name="examples-s3-presign"></a>

Pre-signed Os URLs fornecem acesso temporário a objetos privados do S3 sem exigir que os usuários tenham AWS credenciais ou permissões. 

Por exemplo, vamos supor que Alice tenha acesso a um objeto do S3 e queira compartilhar temporariamente o acesso a esse objeto com Bob. A Alice pode gerar uma solicitação GET pré-assinada para compartilhar com o Bob, para que ele possa baixar o objeto sem exigir acesso às credenciais da Alice. É possível gerar URLs pré-assinados para solicitações HTTP GET e HTTP PUT.

## Gere um URL pré-assinado para um objeto e baixe-o (solicitação GET).
<a name="get-presignedobject"></a>

O exemplo a seguir consiste em duas partes.
+ Parte 1: A Alice gera o URL pré-assinado de um objeto.
+ Parte 2: O Bob baixa o objeto usando o URL pré-assinado.

### Parte 1: Gerar o URL
<a name="get-presigned-object-part1"></a>

A Alice já tem um objeto em um bucket do S3. Ela usa o código a seguir para gerar uma string de URL que o Bob pode usar em uma solicitação GET subsequente.

#### Importações
<a name="get-presigned-example-imports"></a>

```
import com.example.s3.util.PresignUrlUtils;
import org.slf4j.Logger;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import software.amazon.awssdk.utils.IoUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.UUID;
```

```
    /* Create a pre-signed URL to download an object in a subsequent GET request. */
    public String createPresignedGetUrl(String bucketName, String keyName) {
        try (S3Presigner presigner = S3Presigner.create()) {

            GetObjectRequest objectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .build();

            GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))  // The URL will expire in 10 minutes.
                    .getObjectRequest(objectRequest)
                    .build();

            PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest);
            logger.info("Presigned URL: [{}]", presignedRequest.url().toString());
            logger.info("HTTP method: [{}]", presignedRequest.httpRequest().method());

            return presignedRequest.url().toExternalForm();
        }
    }
```

### Parte 2: Baixar o objeto
<a name="get-presigned-object-part2"></a>

Bob usa uma das seguintes opções de código para baixar o objeto. Como alternativa, ele pode usar um navegador para realizar a solicitação GET.

#### Use JDK `HttpUrlConnection (desde a` v1.1)
<a name="get-presigned-example-useHttpUrlConnection"></a>

```
    /* Use the JDK HttpURLConnection (since v1.1) class to do the download. */
    public byte[] useHttpUrlConnectionToGet(String presignedUrlString) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // Capture the response body to a byte array.

        try {
            URL presignedUrl = new URL(presignedUrlString);
            HttpURLConnection connection = (HttpURLConnection) presignedUrl.openConnection();
            connection.setRequestMethod("GET");
            // Download the result of executing the request.
            try (InputStream content = connection.getInputStream()) {
                IoUtils.copy(content, byteArrayOutputStream);
            }
            logger.info("HTTP response code is " + connection.getResponseCode());

        } catch (S3Exception | IOException e) {
            logger.error(e.getMessage(), e);
        }
        return byteArrayOutputStream.toByteArray();
    }
```

#### Usar o JDK `HttpClient` (desde a v11)
<a name="get-presigned-example-useHttpClient"></a>

```
    /* Use the JDK HttpClient (since v11) class to do the download. */
    public byte[] useHttpClientToGet(String presignedUrlString) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // Capture the response body to a byte array.

        HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
        HttpClient httpClient = HttpClient.newHttpClient();
        try {
            URL presignedUrl = new URL(presignedUrlString);
            HttpResponse<InputStream> response = httpClient.send(requestBuilder
                            .uri(presignedUrl.toURI())
                            .GET()
                            .build(),
                    HttpResponse.BodyHandlers.ofInputStream());

            IoUtils.copy(response.body(), byteArrayOutputStream);

            logger.info("HTTP response code is " + response.statusCode());

        } catch (URISyntaxException | InterruptedException | IOException e) {
            logger.error(e.getMessage(), e);
        }
        return byteArrayOutputStream.toByteArray();
    }
```

#### Usar `SdkHttpClient` do SDK para Java
<a name="get-presigned-example-useSdkHttpClient"></a>

```
    /* Use the AWS SDK for Java SdkHttpClient class to do the download. */
    public byte[] useSdkHttpClientToGet(String presignedUrlString) {

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // Capture the response body to a byte array.
        try {
            URL presignedUrl = new URL(presignedUrlString);
            SdkHttpRequest request = SdkHttpRequest.builder()
                    .method(SdkHttpMethod.GET)
                    .uri(presignedUrl.toURI())
                    .build();

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(request)
                    .build();

            try (SdkHttpClient sdkHttpClient = ApacheHttpClient.create()) {
                HttpExecuteResponse response = sdkHttpClient.prepareRequest(executeRequest).call();
                response.responseBody().ifPresentOrElse(
                        abortableInputStream -> {
                            try {
                                IoUtils.copy(abortableInputStream, byteArrayOutputStream);
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        },
                        () -> logger.error("No response body."));

                logger.info("HTTP Response code is {}", response.httpResponse().statusCode());
            }
        } catch (URISyntaxException | IOException e) {
            logger.error(e.getMessage(), e);
        }
        return byteArrayOutputStream.toByteArray();
    }
```

#### Use extensão de URL `S3AsyncClient` pré-assinada
<a name="get-presigned-example-useS3AsyncClient"></a>

O AWS SDK for Java 2.x fornece uma extensão de URL pré-assinada `S3AsyncClient` que baixa objetos usando uma URL pré-assinada por meio do pipeline assíncrono do SDK. Acesse a extensão com`S3AsyncClient.presignedUrlExtension()`. Esse recurso está disponível na versão SDK {{2.48.0}} e posterior.

**Limitação do cliente CRT**  
No momento, o cliente AWS CRT-based S3 (`S3AsyncClient.crtBuilder()`) não oferece suporte à extensão de URL pré-assinada. Use `S3AsyncClient.builder()` em vez disso.

**Requisito do modo Checksum**  
Para validar a integridade dos dados, `checksumMode(ChecksumMode.ENABLED)` defina `GetObjectRequest` quando você gera o URL pré-assinado. Especifique o modo de soma de verificação no momento da pré-assinatura. Você não pode adicioná-lo mais tarde ao executar o download. Quando você usa a extensão de URL `S3AsyncClient` pré-assinada, o SDK envia automaticamente o cabeçalho necessário`x-amz-checksum-mode`.

##### Importações
<a name="get-presigned-s3async-imports"></a>

```
import java.nio.file.Paths;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.presignedurl.model.PresignedUrlDownloadRequest;
```

##### Faça o download em um arquivo ou em bytes
<a name="get-presigned-s3async-download"></a>

------
#### [ Download to file ]

```
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
        .region(Region.US_EAST_1)
        .build();

GetObjectResponse response = s3AsyncClient.presignedUrlExtension()
        .getObject(
            PresignedUrlDownloadRequest.builder()
                .presignedUrl(presignedGetObjectRequest.url())
                .build(),
            Paths.get("/tmp/downloaded-file.bin"))
        .join();

// Or use the consumer builder pattern
GetObjectResponse response = s3AsyncClient.presignedUrlExtension()
        .getObject(
            r -> r.presignedUrl(presignedGetObjectRequest.url()),
            Paths.get("/tmp/downloaded-file.bin"))
        .join();
```

------
#### [ Download to bytes ]

```
S3AsyncClient s3AsyncClient = S3AsyncClient.builder()
        .region(Region.US_EAST_1)
        .build();

ResponseBytes<GetObjectResponse> bytes = s3AsyncClient.presignedUrlExtension()
        .getObject(
            PresignedUrlDownloadRequest.builder()
                .presignedUrl(presignedGetObjectRequest.url())
                .build(),
            AsyncResponseTransformer.toBytes())
        .join();

// Or use the consumer builder pattern
ResponseBytes<GetObjectResponse> bytes = s3AsyncClient.presignedUrlExtension()
        .getObject(
            r -> r.presignedUrl(presignedGetObjectRequest.url()),
            AsyncResponseTransformer.toBytes())
        .join();
```

------

##### Download de várias partes para arquivos grandes
<a name="get-presigned-s3async-multipart"></a>

Para baixar objetos grandes em paralelo, defina `multipartEnabled(true)` no cliente:

------
#### [ Download to file ]

```
S3AsyncClient multipartClient = S3AsyncClient.builder()
        .region(Region.US_EAST_1)
        .multipartEnabled(true)
        .multipartConfiguration(c -> c.minimumPartSizeInBytes(8 * 1024 * 1024L))
        .build();

GetObjectResponse response = multipartClient.presignedUrlExtension()
        .getObject(
            PresignedUrlDownloadRequest.builder()
                .presignedUrl(presignedGetObjectRequest.url())
                .build(),
            Paths.get("/tmp/large-file.bin"))
        .join();
```

------
#### [ Download to bytes ]

```
S3AsyncClient multipartClient = S3AsyncClient.builder()
        .region(Region.US_EAST_1)
        .multipartEnabled(true)
        .multipartConfiguration(c -> c.minimumPartSizeInBytes(8 * 1024 * 1024L))
        .build();

ResponseBytes<GetObjectResponse> bytes = multipartClient.presignedUrlExtension()
        .getObject(
            PresignedUrlDownloadRequest.builder()
                .presignedUrl(presignedGetObjectRequest.url())
                .build(),
            AsyncResponseTransformer.toBytes())
        .join();
```

------

##### Use o Amazon S3 Transfer Manager
<a name="get-presigned-s3async-transfer-manager"></a>

Com o [ Amazon S3 Transfer Manager](transfer-manager.md), você pode baixar objetos usando URLs pré-assinadas com acompanhamento do progresso. `TransferListener`

Adicione o `s3-transfer-manager` artefato ao seu projeto:

```
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>{{2.48.01}}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3-transfer-manager</artifactId>
    </dependency>
</dependencies>
```

1  [ Encontre a versão mais recente da BOM no Repositório ](https://central.sonatype.com/artifact/software.amazon.awssdk/bom) Central do Maven.

##### Importações
<a name="get-presigned-tm-imports"></a>

```
import java.nio.file.Paths;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.presignedurl.model.PresignedUrlDownloadRequest;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload;
import software.amazon.awssdk.transfer.s3.model.Download;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;
```

------
#### [ Download to file ]

```
S3TransferManager transferManager = S3TransferManager.create();

PresignedFileDownload fileDownload = transferManager.downloadFileWithPresignedUrl(
        PresignedDownloadFileRequest.builder()
            .presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder()
                .presignedUrl(presignedGetObjectRequest.url())
                .build())
            .destination(Paths.get("/tmp/transfer-download.bin"))
            .addTransferListener(LoggingTransferListener.create())
            .build());

CompletedFileDownload completed = fileDownload.completionFuture().join();
```

------
#### [ Download to bytes ]

```
S3TransferManager transferManager = S3TransferManager.create();

Download<ResponseBytes<GetObjectResponse>> bytesDownload =
        transferManager.downloadWithPresignedUrl(
            PresignedDownloadRequest.<ResponseBytes<GetObjectResponse>>builder()
                .presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder()
                    .presignedUrl(presignedGetObjectRequest.url())
                    .build())
                .responseTransformer(AsyncResponseTransformer.toBytes())
                .addTransferListener(LoggingTransferListener.create())
                .build());

ResponseBytes<GetObjectResponse> result =
        bytesDownload.completionFuture().join().result();
```

------

**Pausa e retomada não são suportadas**  
Ao contrário do normal`FileDownload`, `PresignedFileDownload` não oferece suporte para pausa e retomada porque URLs pré-assinados podem expirar durante uma transferência pausada.

Para obter mais informações sobre o Amazon S3 Transfer Manager, incluindo opções de configuração e exemplos adicionais, consulte[Transfira arquivos e diretórios com o Gerenciador de transferências do Amazon S3](transfer-manager.md).

Veja o exemplo [ completo ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/d73001daea05266eaa9e074ccb71b9383832369a/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedGetUrlAndRetrieve.java) e [ teste ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/d73001daea05266eaa9e074ccb71b9383832369a/javav2/example_code/s3/src/test/java/com/example/s3/presignurl/GeneratePresignedGetUrlTests.java) em GitHub.

## Gerar um URL pré-assinado para um upload e, depois, fazer upload de um arquivo (solicitação PUT)
<a name="put-presignedobject"></a>

O exemplo a seguir consiste em duas partes.
+ Parte 1: A Alice gera o URL pré-assinado para fazer upload de um objeto.
+ Parte 2: O Bob faz upload de um arquivo usando o URL pré-assinado.

### Parte 1: Gerar o URL
<a name="put-presigned-object-part1"></a>

A Alice já tem um bucket do S3. Ela usa o código a seguir para gerar uma string de URL que o Bob pode usar em uma solicitação PUT subsequente.

#### Importações
<a name="put-presigned-example-imports"></a>

```
import com.example.s3.util.PresignUrlUtils;
import org.slf4j.Logger;
import software.amazon.awssdk.core.internal.sync.FileContentStreamProvider;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.Map;
import java.util.UUID;
```

```
    /* Create a presigned URL to use in a subsequent PUT request */
    public String createPresignedUrl(String bucketName, String keyName, Map<String, String> metadata) {
        try (S3Presigner presigner = S3Presigner.create()) {

            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .metadata(metadata)
                    .build();

            PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))  // The URL expires in 10 minutes.
                    .putObjectRequest(objectRequest)
                    .build();


            PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);
            String myURL = presignedRequest.url().toString();
            logger.info("Presigned URL to upload a file to: [{}]", myURL);
            logger.info("HTTP method: [{}]", presignedRequest.httpRequest().method());

            return presignedRequest.url().toExternalForm();
        }
    }
```

### Parte 2: Fazer upload de um objeto de arquivo
<a name="put-presigned-object-part2"></a>

O Bob usa uma das três opções de código a seguir para fazer upload de um arquivo.

#### Use JDK `HttpUrlConnection (desde a` v1.1)
<a name="put-presigned-example-useHttpUrlConnection"></a>

```
    /* Use the JDK HttpURLConnection (since v1.1) class to do the upload. */
    public void useHttpUrlConnectionToPut(String presignedUrlString, File fileToPut, Map<String, String> metadata) {
        logger.info("Begin [{}] upload", fileToPut.toString());
        try {
            URL presignedUrl = new URL(presignedUrlString);
            HttpURLConnection connection = (HttpURLConnection) presignedUrl.openConnection();
            connection.setDoOutput(true);
            metadata.forEach((k, v) -> connection.setRequestProperty("x-amz-meta-" + k, v));
            connection.setRequestMethod("PUT");
            OutputStream out = connection.getOutputStream();

            try (RandomAccessFile file = new RandomAccessFile(fileToPut, "r");
                 FileChannel inChannel = file.getChannel()) {
                ByteBuffer buffer = ByteBuffer.allocate(8192); //Buffer size is 8k

                while (inChannel.read(buffer) > 0) {
                    buffer.flip();
                    for (int i = 0; i < buffer.limit(); i++) {
                        out.write(buffer.get());
                    }
                    buffer.clear();
                }
            } catch (IOException e) {
                logger.error(e.getMessage(), e);
            }

            out.close();
            connection.getResponseCode();
            logger.info("HTTP response code is " + connection.getResponseCode());

        } catch (S3Exception | IOException e) {
            logger.error(e.getMessage(), e);
        }
    }
```

#### Usar o JDK `HttpClient` (desde a v11)
<a name="put-presigned-example-useHttpClient"></a>

```
    /* Use the JDK HttpClient (since v11) class to do the upload. */
    public void useHttpClientToPut(String presignedUrlString, File fileToPut, Map<String, String> metadata) {
        logger.info("Begin [{}] upload", fileToPut.toString());

        HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
        metadata.forEach((k, v) -> requestBuilder.header("x-amz-meta-" + k, v));

        HttpClient httpClient = HttpClient.newHttpClient();
        try {
            final HttpResponse<Void> response = httpClient.send(requestBuilder
                            .uri(new URL(presignedUrlString).toURI())
                            .PUT(HttpRequest.BodyPublishers.ofFile(Path.of(fileToPut.toURI())))
                            .build(),
                    HttpResponse.BodyHandlers.discarding());

            logger.info("HTTP response code is " + response.statusCode());

        } catch (URISyntaxException | InterruptedException | IOException e) {
            logger.error(e.getMessage(), e);
        }
    }
```

#### Usar `SdkHttpClient` do SDK para Java
<a name="put-presigned-example-useSdkHttpClient"></a>

```
    /* Use the AWS SDK for Java V2 SdkHttpClient class to do the upload. */
    public void useSdkHttpClientToPut(String presignedUrlString, File fileToPut, Map<String, String> metadata) {
        logger.info("Begin [{}] upload", fileToPut.toString());

        try {
            URL presignedUrl = new URL(presignedUrlString);

            SdkHttpRequest.Builder requestBuilder = SdkHttpRequest.builder()
                    .method(SdkHttpMethod.PUT)
                    .uri(presignedUrl.toURI());
            // Add headers
            metadata.forEach((k, v) -> requestBuilder.putHeader("x-amz-meta-" + k, v));
            // Finish building the request.
            SdkHttpRequest request = requestBuilder.build();

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(request)
                    .contentStreamProvider(new FileContentStreamProvider(fileToPut.toPath()))
                    .build();

            try (SdkHttpClient sdkHttpClient = ApacheHttpClient.create()) {
                HttpExecuteResponse response = sdkHttpClient.prepareRequest(executeRequest).call();
                logger.info("Response code: {}", response.httpResponse().statusCode());
            }
        } catch (URISyntaxException | IOException e) {
            logger.error(e.getMessage(), e);
        }
    }
```

Veja o exemplo [ completo ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/d73001daea05266eaa9e074ccb71b9383832369a/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlAndPutFileWithMetadata.java) e [ teste ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/d73001daea05266eaa9e074ccb71b9383832369a/javav2/example_code/s3/src/test/java/com/example/s3/presignurl/GeneratePresignedPutUrlTests.java) em GitHub.

## Incluir campos de solicitação como parâmetros de consulta de URL
<a name="presign-query-parameters"></a>

Alguns campos de solicitação são [ GetObjectRequest ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/GetObjectRequest.html) [ PutObjectRequest ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/PutObjectRequest.html) mapeados para cabeçalhos HTTP em vez de parâmetros de consulta de URL. Por exemplo,,`requestPayer`, `acl` `metadata``serverSideEncryption`, e `storageClass` mapear para `x-amz-*` cabeçalhos. Quando você pré-assina uma solicitação que define um desses campos, a assinatura cobre os cabeçalhos. No entanto, o URL pré-assinado que o [ S3Presigner ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/presigner/S3Presigner.html) retorna não contém os valores do cabeçalho.

O chamador do URL pré-assinado deve enviar os mesmos `x-amz-*` cabeçalhos com a solicitação. Caso contrário, o Amazon S3 retornará`SignatureDoesNotMatch`. Clientes HTTP que podem definir cabeçalhos personalizados enviam esses cabeçalhos diretamente. Por exemplo, o`HttpURLConnection`,`HttpClient`, e os [ SdkHttpClient ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/SdkHttpClient.html) exemplos mostrados anteriormente fazem isso. No entanto, se o chamador não conseguir definir cabeçalhos personalizados, a solicitação falhará. Exemplos comuns incluem um navegador da Web abrindo a URL como um link, um formulário em HTML carregando diretamente para o Amazon S3 e qualquer cliente HTTP que receba apenas a URL como entrada.

Para fazer o URL funcionar sem cabeçalhos extras, passe o valor como um parâmetro de consulta assinado em vez de definir o campo digitado. Use, [ RawQueryParameter ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/RequestOverrideConfiguration.Builder.html#putRawQueryParameter(java.lang.String,java.lang.String)) coloque [ AwsRequestOverrideConfiguration](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/awscore/AwsRequestOverrideConfiguration.html).

### Pre-sign uma solicitação GET com requester-pays
<a name="presign-query-parameters-get-example"></a>

O exemplo a seguir gera uma URL pré-assinada para um `GetObjectRequest` com a configuração solicitante-pay. Como o valor é um parâmetro de consulta, qualquer chamador pode usar a URL sem enviar um `x-amz-request-payer` cabeçalho.

```
try (S3Presigner presigner = S3Presigner.create()) {
    GetObjectRequest getObjectRequest = GetObjectRequest.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("example-key")
            .overrideConfiguration(o -> o.putRawQueryParameter("x-amz-request-payer", "requester"))
            .build();

    GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
            .signatureDuration(Duration.ofMinutes(10))
            .getObjectRequest(getObjectRequest)
            .build();

    PresignedGetObjectRequest presigned = presigner.presignGetObject(presignRequest);
    logger.info("Pre-signed URL: [{}]", presigned.url());

    // Confirm the URL requires no headers at request time:
    logger.info("Signed headers: {}", presigned.signedHeaders().keySet());  // [host]
}
```

### Pre-sign uma solicitação PUT com metadados
<a name="presign-query-parameters-put-example"></a>

O exemplo a seguir gera uma URL pré-assinada para um `PutObjectRequest` com dois valores de metadados como parâmetros de consulta assinados. Como os valores são parâmetros de consulta, qualquer chamador pode usar o URL sem enviar `x-amz-meta-*` cabeçalhos.

```
try (S3Presigner presigner = S3Presigner.create()) {
    PutObjectRequest putObjectRequest = PutObjectRequest.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("example-key")
            .overrideConfiguration(o -> o
                    .putRawQueryParameter("x-amz-meta-author", "alice")
                    .putRawQueryParameter("x-amz-meta-purpose", "demo"))
            .build();

    PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
            .signatureDuration(Duration.ofMinutes(10))
            .putObjectRequest(putObjectRequest)
            .build();

    PresignedPutObjectRequest presigned = presigner.presignPutObject(presignRequest);
    logger.info("Pre-signed URL: [{}]", presigned.url());

    // Confirm the URL requires no headers at upload time:
    logger.info("Signed headers: {}", presigned.signedHeaders().keySet());  // [host]
}
```

### Pre-sign uma solicitação PUT e o upload de um arquivo
<a name="presign-query-parameters-helper"></a>

O exemplo a seguir mostra o fluxo de trabalho completo: um método que pré-assina uma solicitação PUT com quaisquer `x-amz-*` nomes e valores que você fornece como um mapa e um método que carrega o arquivo com. `SdkHttpClient` Como os valores já fazem parte do URL assinado, o método de upload não define nenhum `x-amz-*` cabeçalho. Por outro lado, os exemplos de upload anteriores definem `x-amz-meta-*` os cabeçalhos explicitamente.

#### Importações
<a name="presign-query-parameters-helper-imports"></a>

```
import com.example.s3.util.PresignUrlUtils;
import org.slf4j.Logger;
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
import software.amazon.awssdk.core.internal.sync.FileContentStreamProvider;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.Map;
import java.util.UUID;
```

Gere o URL.

```
    /**
     *  Creates a presigned URL to use in a subsequent HTTP PUT request. The code adds query parameters
     *  to the request instead of using headers. By using query parameters, you do not need to add the
     *  the parameters as headers when the PUT request is eventually sent.
     *
     * @param bucketName Bucket name where the object will be uploaded.
     * @param keyName Key name of the object that will be uploaded.
     * @param queryParams Query string parameters to be added to the presigned URL.
     * @return
     */
    public String createPresignedUrl(String bucketName, String keyName, Map<String, String> queryParams) {
        try (S3Presigner presigner = S3Presigner.create()) {
            // Create an override configuration to store the query parameters.
            AwsRequestOverrideConfiguration.Builder overrideConfigurationBuilder = AwsRequestOverrideConfiguration.builder();

            queryParams.forEach(overrideConfigurationBuilder::putRawQueryParameter);

            PutObjectRequest objectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(keyName)
                    .overrideConfiguration(overrideConfigurationBuilder.build()) // Add the override configuration.
                    .build();

            PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                    .signatureDuration(Duration.ofMinutes(10))  // The URL expires in 10 minutes.
                    .putObjectRequest(objectRequest)
                    .build();


            PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(presignRequest);
            String myURL = presignedRequest.url().toString();
            logger.info("Presigned URL to upload a file to: [{}]", myURL);
            logger.info("HTTP method: [{}]", presignedRequest.httpRequest().method());

            return presignedRequest.url().toExternalForm();
        }
    }
```

Faça o upload do arquivo com`SdkHttpClient`.

```
    /**
     * Use the AWS SDK for Java V2 SdkHttpClient class to execute the PUT request. Since the
     * URL contains the query parameters, no headers are needed for metadata, SSE settings, or ACL settings.
     *
     * @param presignedUrlString The URL for the PUT request.
     * @param fileToPut File to uplaod
     */
    public void useSdkHttpClientToPut(String presignedUrlString, File fileToPut) {
        logger.info("Begin [{}] upload", fileToPut.toString());

        try {
            URL presignedUrl = new URL(presignedUrlString);

            SdkHttpRequest.Builder requestBuilder = SdkHttpRequest.builder()
                    .method(SdkHttpMethod.PUT)
                    .uri(presignedUrl.toURI());

            SdkHttpRequest request = requestBuilder.build();

            HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
                    .request(request)
                    .contentStreamProvider(new FileContentStreamProvider(fileToPut.toPath()))
                    .build();

            try (SdkHttpClient sdkHttpClient = ApacheHttpClient.create()) {
                HttpExecuteResponse response = sdkHttpClient.prepareRequest(executeRequest).call();
                logger.info("Response code: {}", response.httpResponse().statusCode());
            }
        } catch (URISyntaxException | IOException e) {
            logger.error(e.getMessage(), e);
        }
    }
```

Veja o exemplo [ completo ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/0a2b7b1db35fa7b8fd362222c449f43881d67895/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlAndPutFileWithQueryParams.java) e [ teste ](https://github.com/awsdocs/aws-doc-sdk-examples/blob/0a2b7b1db35fa7b8fd362222c449f43881d67895/javav2/example_code/s3/src/test/java/com/example/s3/presignurl/GeneratePresignedPutUrlTests.java) em GitHub.

### Verifique quais cabeçalhos uma solicitação pré-assinada exige
<a name="presign-query-parameters-verify"></a>

Para verificar quais cabeçalhos uma solicitação pré-assinada específica exige que o chamador envie, chame [ signedHeaders () no cabeçalho retornado. ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/awscore/presigner/PresignedRequest.html#signedHeaders()) [ PresignedRequest ](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/awscore/presigner/PresignedRequest.html) Qualquer `x-amz-*` nome no mapa retornado é um cabeçalho que o chamador deve enviar. Se você quiser remover um cabeçalho do requisito, transmita seu valor `putRawQueryParameter` em vez de definir o campo digitado.