Utilizzo di TransferManager perAmazon S3Operazioni - AWS SDK for Java 1. x

Abbiamo annunciato l'imminente versione end-of-support di AWS SDK for Java (v1). Ti consigliamo di migrare alla AWS SDK for Java v2. Per date, dettagli aggiuntivi e informazioni su come effettuare la migrazione, consulta l'annuncio collegato.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di TransferManager perAmazon S3Operazioni

Puoi utilizzare il pluginAWS SDK for Java TransferManager classe per trasferire in modo affidabile i file dall'ambiente locale aAmazon S3e per copiare oggetti da una posizione S3 a un'altra.TransferManagerpuò ottenere lo stato di avanzamento di un trasferimento e mettere in pausa o riprendere caricamenti e download.

Nota

Best practice

Ti consigliamo di abilitare la regola del ciclo di vita AbortIncompleteMultipartUpload sui bucket Amazon S3.

Questa regola indica a Amazon S3 di interrompere l'esecuzione di caricamenti in più parti che non sono stati completati entro un determinato numero di giorni dopo l'avvio. Quando questo limite di tempo impostato viene superato, Amazon S3 interrompe il caricamento ed elimina i dati di caricamento incompleti.

Per ulteriori informazioni, consultaConfigurazione del ciclo di vita per un bucket con funzione Versioni multiplenellaAmazon S3Guida per l'utente di .

Nota

Questi esempi di codice presuppongono che tu comprenda il materiale inUtilizzo diAWS SDK for Javae hanno configurato il valore predefinitoAWScredenziali che utilizzano le informazioni inConfigurazioneAWSCredenziali e regione per lo sviluppo.

Caricamento di file e directory

TransferManager può caricare file, elenchi di file e directory su qualsiasiAmazon S3secchi che haicreato in precedenza.

Caricamento di un file singolo

Chiama TransferManageruploadmetodo, fornendo unAmazon S3nome bucket, nome chiave (oggetto) e Java standardFileoggetto che rappresenta il file da caricare.

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;

Codice

File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Upload xfer = xfer_mgr.upload(bucket_name, key_name, f); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Lauploadrestituisce il metodoimmediatamente, fornendo unUploadoggetto da utilizzare per verificare lo stato di trasferimento o per attenderne il completamento.

Consulta .Attendi il completamento di un trasferimentoper informazioni sull'uso diwaitForCompletionper completare con successo un trasferimento prima di chiamare TransferManagershutdownNowmetodo. In attesa del completamento del trasferimento, è possibile effettuare il sondaggio o ascoltare aggiornamenti sullo stato e sui progressi. Consulta .Ottieni stato di trasferimento e avanzamentoper ulteriori informazioni.

Vedi l'esempio completo su GitHub.

Carica un elenco di file

Per caricare più file in un'unica operazione, chiama TransferManageruploadFileListmetodo, fornendo quanto segue:

  • Un recordAmazon S3nome bucket

  • UNprefisso della chiaveper anticipare i nomi degli oggetti creati (il percorso all'interno del bucket in cui posizionare gli oggetti)

  • UNFileoggetto che rappresenta la directory relativa da cui creare percorsi file

  • UNElencooggetto contenente un set diFileoggetti da caricare

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;

Codice

ArrayList<File> files = new ArrayList<File>(); for (String path : file_paths) { files.add(new File(path)); } TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileUpload xfer = xfer_mgr.uploadFileList(bucket_name, key_prefix, new File("."), files); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Consulta .Attendi il completamento di un trasferimentoper informazioni sull'uso diwaitForCompletionper completare con successo un trasferimento prima di chiamare TransferManagershutdownNowmetodo. In attesa del completamento del trasferimento, è possibile effettuare il sondaggio o ascoltare aggiornamenti sullo stato e sui progressi. Consulta .Ottieni stato di trasferimento e avanzamentoper ulteriori informazioni.

LaMultipleFileUploadoggetto restituito dauploadFileListpuò essere utilizzato per interrogare lo stato di trasferimento o lo stato di avanzamento. Consulta .Sondaggio dell'attuale avanzamento di un trasferimentoeOttieni l'avanzamento del trasferimento con un ProgressListenerper ulteriori informazioni.

È possibile utilizzare ancheMultipleFileUpload'sgetSubTransfersmetodo per ottenere l'individuoUploadoggetti per ogni file trasferito. Per ulteriori informazioni, consultaOttieni lo stato di avanzamento dei subtrasferimenti.

Vedi l'esempio completo su GitHub.

Caricamento di una directory

Puoi utilizzare TransferManageruploadDirectorymetodo per caricare un'intera directory di file, con la possibilità di copiare i file nelle sottodirectory in modo ricorsivo. Fornisci unAmazon S3nome del bucket, key prefix S3, aFileoggetto che rappresenta la directory locale da copiare e abooleanvalore che indica se si desidera copiare le sottodirectory in modo ricorsivo (veroofalso).

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.MultipleFileUpload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; import java.io.File; import java.util.ArrayList; import java.util.Arrays;

Codice

TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucket_name, key_prefix, new File(dir_path), recursive); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Consulta .Attendi il completamento di un trasferimentoper informazioni sull'uso diwaitForCompletionper completare con successo un trasferimento prima di chiamare TransferManagershutdownNowmetodo. In attesa del completamento del trasferimento, è possibile effettuare il sondaggio o ascoltare aggiornamenti sullo stato e sui progressi. Consulta .Ottieni stato di trasferimento e avanzamentoper ulteriori informazioni.

LaMultipleFileUploadoggetto restituito dauploadFileListpuò essere utilizzato per interrogare lo stato di trasferimento o lo stato di avanzamento. Consulta .Sondaggio dell'attuale avanzamento di un trasferimentoeOttieni l'avanzamento del trasferimento con un ProgressListenerper ulteriori informazioni.

È possibile utilizzare ancheMultipleFileUpload'sgetSubTransfersmetodo per ottenere l'individuoUploadoggetti per ogni file trasferito. Per ulteriori informazioni, consultaOttieni lo stato di avanzamento dei subtrasferimenti.

Vedi l'esempio completo su GitHub.

Download di file o directory

Utilizzo dell' TransferManager classe per scaricare un singolo file (Amazon S3object) o una directory (unAmazon S3nome del bucket (seguito da un prefisso oggetto) daAmazon S3.

Download di un file singolo

Usa il TransferManagerdownloadmetodo, fornendo ilAmazon S3nome bucket contenente l'oggetto che si desidera scaricare, il nome della chiave (oggetto) e unFileoggetto che rappresenta il file da creare sul sistema locale.

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Download; import com.amazonaws.services.s3.transfer.MultipleFileDownload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import java.io.File;

Codice

File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Download xfer = xfer_mgr.download(bucket_name, key_name, f); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Consulta .Attendi il completamento di un trasferimentoper informazioni sull'uso diwaitForCompletionper completare con successo un trasferimento prima di chiamare TransferManagershutdownNowmetodo. In attesa del completamento del trasferimento, è possibile effettuare il sondaggio o ascoltare aggiornamenti sullo stato e sui progressi. Consulta .Ottieni stato di trasferimento e avanzamentoper ulteriori informazioni.

Vedi l'esempio completo su GitHub.

Scarica una directory

Per scaricare un set di file che condividono un key prefix comune (analogo a una directory su un file system) daAmazon S3, usa TransferManagerdownloadDirectorymetodo. Il metodo accetta ilAmazon S3nome bucket contenente gli oggetti che si desidera scaricare, il prefisso dell'oggetto condiviso da tutti gli oggetti eFileoggetto che rappresenta la directory in cui scaricare i file nel sistema locale. Se la directory con nome non esiste ancora, verrà creata.

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Download; import com.amazonaws.services.s3.transfer.MultipleFileDownload; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import java.io.File;

Codice

TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { MultipleFileDownload xfer = xfer_mgr.downloadDirectory( bucket_name, key_prefix, new File(dir_path)); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Consulta .Attendi il completamento di un trasferimentoper informazioni sull'uso diwaitForCompletionper completare con successo un trasferimento prima di chiamare TransferManagershutdownNowmetodo. In attesa del completamento del trasferimento, è possibile effettuare il sondaggio o ascoltare aggiornamenti sullo stato e sui progressi. Consulta .Ottieni stato di trasferimento e avanzamentoper ulteriori informazioni.

Vedi l'esempio completo su GitHub.

Copia oggetti

Per copiare un oggetto da un bucket S3 in un altro, utilizzare TransferManagercopymetodo.

Importazioni

import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.transfer.Copy; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder;

Codice

System.out.println("Copying s3 object: " + from_key); System.out.println(" from bucket: " + from_bucket); System.out.println(" to s3 object: " + to_key); System.out.println(" in bucket: " + to_bucket); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Copy xfer = xfer_mgr.copy(from_bucket, from_key, to_bucket, to_key); // loop with Transfer.isDone() XferMgrProgress.showTransferProgress(xfer); // or block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(xfer); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Vedi l'esempio completo su GitHub.

Attendi il completamento di un trasferimento

Se l'applicazione (o il thread) può bloccarsi fino al completamento del trasferimento, è possibile utilizzare iltrasferimentointerfacciawaitForCompletionmetodo per bloccare fino al completamento del trasferimento o si verifica un'eccezione.

try { xfer.waitForCompletion(); } catch (AmazonServiceException e) { System.err.println("Amazon service error: " + e.getMessage()); System.exit(1); } catch (AmazonClientException e) { System.err.println("Amazon client error: " + e.getMessage()); System.exit(1); } catch (InterruptedException e) { System.err.println("Transfer interrupted: " + e.getMessage()); System.exit(1); }

Si ottengono progressi nei trasferimenti se effettui un sondaggio per eventiprimavocazionewaitForCompletion, implementare un meccanismo di polling su un thread separato o ricevere gli aggiornamenti dello stato di avanzamento in modo asincrono utilizzando unProgressListener.

Vedi l'esempio completo su GitHub.

Ottieni stato di trasferimento e avanzamento

Ciascuna delle classi restituite dal TransferManagerupload*,download*, ecopymethods restituisce un'istanza di una delle seguenti classi, a seconda che si tratti di un'operazione a file singolo o a più file.

Classe Restituiti da

Copia

copy

Scarica

download

MultipleFileDownload

downloadDirectory

Caricamento

upload

MultipleFileUpload

uploadFileList, uploadDirectory

Tutte queste classi implementano iltrasferimentointerfaccia.Transferfornisce metodi utili per ottenere l'avanzamento di un trasferimento, sospendere o riprendere il trasferimento e ottenere lo stato corrente o finale del trasferimento.

Sondaggio dell'attuale avanzamento di un trasferimento

Questo ciclo stampa lo stato di avanzamento di un trasferimento, ne esamina il progresso corrente durante l'esecuzione e, una volta completato, ne stampa lo stato finale.

Importazioni

import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;

Codice

// print the transfer's human-readable description System.out.println(xfer.getDescription()); // print an empty progress bar... printProgressBar(0.0); // update the progress bar while the xfer is ongoing. do { try { Thread.sleep(100); } catch (InterruptedException e) { return; } // Note: so_far and total aren't used, they're just for // documentation purposes. TransferProgress progress = xfer.getProgress(); long so_far = progress.getBytesTransferred(); long total = progress.getTotalBytesToTransfer(); double pct = progress.getPercentTransferred(); eraseProgressBar(); printProgressBar(pct); } while (xfer.isDone() == false); // print the final state of the transfer. TransferState xfer_state = xfer.getState(); System.out.println(": " + xfer_state);

Vedi l'esempio completo su GitHub.

Ottieni l'avanzamento del trasferimento con un ProgressListener

È possibile collegare unProgressListenera qualsiasi trasferimento utilizzando iltrasferimentointerfacciaaddProgressListenermetodo.

UNProgressListenerrichiede un solo metodo,progressChanged, che richiede unProgressEventoggetto. È possibile utilizzare l'oggetto per ottenere i byte totali dell'operazione chiamandonegetBytesmetodo e il numero di byte trasferiti finora chiamandogetBytesTransferred.

Importazioni

import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;

Codice

File f = new File(file_path); TransferManager xfer_mgr = TransferManagerBuilder.standard().build(); try { Upload u = xfer_mgr.upload(bucket_name, key_name, f); // print an empty progress bar... printProgressBar(0.0); u.addProgressListener(new ProgressListener() { public void progressChanged(ProgressEvent e) { double pct = e.getBytesTransferred() * 100.0 / e.getBytes(); eraseProgressBar(); printProgressBar(pct); } }); // block with Transfer.waitForCompletion() XferMgrProgress.waitForCompletion(u); // print the final state of the transfer. TransferState xfer_state = u.getState(); System.out.println(": " + xfer_state); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } xfer_mgr.shutdownNow();

Vedi l'esempio completo su GitHub.

Ottieni lo stato di avanzamento dei subtrasferimenti

LaMultipleFileUploadclass può restituire informazioni sui suoi subtrasferimenti chiamandoligetSubTransfersmetodo. Restituisce un elemento non modificabileRaccoltadiCaricamentooggetti che forniscono lo stato di trasferimento individuale e l'avanzamento di ogni subtrasferimento.

Importazioni

import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.event.ProgressEvent; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.s3.transfer.*; import com.amazonaws.services.s3.transfer.Transfer.TransferState; import java.io.File; import java.util.ArrayList; import java.util.Collection;

Codice

Collection<? extends Upload> sub_xfers = new ArrayList<Upload>(); sub_xfers = multi_upload.getSubTransfers(); do { System.out.println("\nSubtransfer progress:\n"); for (Upload u : sub_xfers) { System.out.println(" " + u.getDescription()); if (u.isDone()) { TransferState xfer_state = u.getState(); System.out.println(" " + xfer_state); } else { TransferProgress progress = u.getProgress(); double pct = progress.getPercentTransferred(); printProgressBar(pct); System.out.println(); } } // wait a bit before the next update. try { Thread.sleep(200); } catch (InterruptedException e) { return; } } while (multi_upload.isDone() == false); // print the final state of the transfer. TransferState xfer_state = multi_upload.getState(); System.out.println("\nMultipleFileUpload " + xfer_state);

Vedi l'esempio completo su GitHub.

Ulteriori informazioni