ti-enxame.com

É possível realizar um upload em lote para o Amazon s3?

O Amazon s3 suporta uploads em lote? Eu tenho um trabalho que precisa carregar cada noite ~ 100K de arquivos que podem ser de até 1G, mas é fortemente inclinado para arquivos pequenos (90% têm menos de 100 bytes e 99% têm menos de 1000 bytes) .

A API s3 suporta o upload de vários objetos em uma única chamada HTTP?

Todos os objetos devem estar disponíveis no S3 como objetos individuais. Eu não posso hospedá-los em qualquer outro lugar (FTP, etc) ou em outro formato (banco de dados, unidade local EC2, etc). Esse é um requisito externo que não posso mudar.

50
flybywire

A API s3 suporta o upload de vários objetos em uma única chamada HTTP?

Não, a operação S3 PUT suporta apenas o upload de um objeto por solicitação HTTP. 

Você pode instalar S3 Tools em sua máquina que deseja sincronizar com o bucket remoto e executar o seguinte comando:

s3cmd sync localdirectory s3://bucket/

Então você poderia colocar este comando em um script e criar um trabalho agendado para executar este comando a cada noite.

Isso deve fazer o que você quiser. 

A ferramenta executa a sincronização de arquivos com base em hashes MD5 e tamanho do arquivo, portanto, a colisão deve ser rara (se você realmente quiser, basta usar o comando "s3cmd put" para forçar a sobrescrita de objetos no seu bloco de destino).

EDIT: Também certifique-se de ler a documentação no site que eu vinculado para S3 Tools - existem diferentes sinalizadores necessários para se você deseja arquivos excluídos localmente para ser excluído do balde ou ignorado etc.

29
Ryan Weir

Alternativamente, você pode fazer upload do S3 através da ferramenta AWS CLI usando o comando sync.

aws s3 sync pasta_local s3: // nome_do_banco 

Você pode usar esse método para fazer upload em lote de arquivos para o S3 com muita rapidez.

38
RubyFanatic

Para adicionar ao que todos estão dizendo, se você quiser que seu código Java (em vez da CLI) faça isso sem ter que colocar todos os arquivos em um único diretório, é possível criar uma lista de arquivos a serem carregados e depois fornecer isso lista para o método uploadFileList do AWS TransferManager.

https://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html#uploadFileList-Java.lang.String-Java.lang.String-Java. io.File-Java.util.List-

0
Samuel Dominguez

Um arquivo (ou parte de um arquivo) = uma solicitação HTTP, mas a API Java agora suporta o upload eficiente de vários arquivos sem ter que gravar o multithread por conta própria, usando TransferManager

0
Oren

Se você quiser usar o programa Java para fazer isso, você pode fazer:

public  void uploadFolder(String bucket, String path, boolean includeSubDirectories) {
    File dir = new File(path);
    MultipleFileUpload upload = transferManager.uploadDirectory(bucket, "", dir, includeSubDirectories);
    try {
        upload.waitForCompletion();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

A criação do s3client e do gerenciador de transferência para se conectar ao S3 local, se você deseja testar, é a seguinte:

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, token);
    s3Client = new AmazonS3Client(credentials); // This is deprecated but you can create using standard beans provided by spring/aws
    s3Client.setEndpoint("http://127.0.0.1:9000");//If you wish to connect to local S3 using minio etc...
    TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();
0
Saurabh Valsangkar