2016-12-16 2 views
1

Ich verwende den AWS Transfer Manager, um viele Dateien in S3 zu sichern. Manchmal schlägt die Sicherung in der Mitte in der Mitte fehl, und ich möchte nicht alle Dateien erneut hochladen, sondern nur die, die noch nicht hochgeladen wurden.Wie lade ich eine Datei nur dann auf S3 hoch, wenn sie nicht bereits hochgeladen wurde?

Ist im Transfer Manager oder in der S3 Put Request etwas gebacken, das würde ich das automatisch machen lassen, oder ist meine einzige Lösung, das MD5 der Datei mit einer HEAD-Anfrage zuerst zu überprüfen und vor dem Start zu sehen, ob es anders ist der Upload

Danke!

Antwort

0

Sie können das mit dem continue with block tun. Für jeden Upload können Sie eine Wiederholungsstrategie im Fall des fehlgeschlagenen Uploads definieren. Für z.B .:

[[transferManager upload:uploadRequest] continueWithBlock:^id(AWSTask *task) { 
     if (task.error){ 
      // Handle failed upload here 
     } 

     if (task.result) { 
      //File uploaded successfully. 
     } 
     return nil; 
    }]; 

könnten Sie auch eine Liste von Aufgaben erstellen und dann

NSMutableArray *tasks = [NSMutableArray new];  
AWSTask * taskForUpload = [transferManager upload:uploadRequest]; 
[tasks addObject:taskForUpload]; 
// add more tasks as required  
[[AWSTask taskForCompletionOfAllTasks:tasks] continueWithBlock:^id(AWSTask *task) { 
         if (task.error != nil) { 
          // Handler error/failed uploads here 
         } else { 
          // Handle successful uploads here 
         }       
         return nil; 
        }]; 

Diese alle Aufgaben in der Liste durchführen und verwenden Sie dann Liste der Fehler geben, die Sie versuchen können.

Danke, Rohan

+0

Danke, aber in meinem Anwendungsfall muss ich den Upload möglicherweise erst Tage später neu starten, da die App in der Zwischenzeit gelöscht und neu gestartet wurde. Ich würde mir also etwas zuverlässigeres in diesem Sinne wünschen. – Kamchatka

+0

Sorry, aber dieser spezifische Anwendungsfall wird nicht direkt vom Übertragungsprogramm unterstützt. Sie müssen eine benutzerdefinierte Logik auf Ihrer App-Seite codieren, um den Anwendungsfall zu erreichen. –

+0

OK, danke @Rohan. Ich plane, meinen Objekten MD5-Metadaten hinzuzufügen und das MD5 zu berechnen und mit HEAD zu überprüfen, ob das MD5 das gleiche ist, bevor ich mich entscheide, es hochzuladen oder nicht. Ich habe immer noch einen Bug mit der Kopf-Anfrage - ich denke - wo es Fehler nicht richtig zurückgibt (http://stackoverflow.com/questions/41197569/aws-s3-head-request-not-returning-404- when-file-doesnt-not-exist). – Kamchatka

0

Anstatt Ihre eigene Lösung Codierung, könnten Sie die AWS Command-Line Interface (CLI) verwenden, um die Dateien auf Amazon S3 zu kopieren oder zu synchronisieren.

Zum Beispiel:

aws s3 sync <directory> s3://my-bucket/<directory> 

Der Sync-Befehl wird nur Dateien kopieren, die nicht im Ziel sind. Führen Sie es also regelmäßig aus und es werden alle Dateien in den S3-Bucket kopiert!

+0

Danke, aber ich suche nach einer Lösung für die Implementierung in einer iOS/Android App. – Kamchatka

Verwandte Themen