2017-01-18 1 views
2

Это мой код, чтобы выполнить задачу загрузки:AWS S3 iOS SDK: как возобновить загрузку после того, как соединение прервано?

let image = UIImage(named: "12.jpeg") 
let fileManager = FileManager.default 
let imageData = UIImageJPEGRepresentation(image!, 0.99) 
let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("\(imageData!).jpeg") 

fileManager.createFile(atPath: path as String, contents: imageData, attributes: nil) 

let fileUrl = NSURL(fileURLWithPath: path) 

uploadRequest?.bucket = "testrawdata" 
uploadRequest?.key = "test/loodfd.jpeg" 
uploadRequest?.contentType = "image/jpeg" 
uploadRequest?.body = fileUrl as URL! 
uploadRequest?.serverSideEncryption = AWSS3ServerSideEncryption.awsKms 
uploadRequest?.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in 
    DispatchQueue.main.async(execute: { 

     print("bytes sent \(bytesSent), total bytes sent \(totalBytesSent), of total \(totalBytesExpectedToSend)") 

    }) 
} 


transferManager?.upload(uploadRequest).continue(with: AWSExecutor.mainThread(), withSuccessBlock: { (taskk: AWSTask) -> Any? in 
    if taskk.error != nil { 
     // Error. 
    } else { 
     // Do something with your result. 
    } 
    return nil 
}) 
} 

Я знаю, мне не нужно, чтобы применить его к изображению, но это всего лишь пример, по умолчанию я буду отправлять файлы как 100mb ,

Когда я переношу свой телефон в режим полета во время передачи, снова включите сеть, он не завершит задачу загрузки.

В документах не указано, что делать, чтобы возобновить прерванную задачу.

Вот что я пробовал:

я ставлю инициализации запроса и менеджера в viewDidLoad(), чтобы гарантировать, что я не создаю другой запрос

class ViewController: UIViewController { 

var uploadRequest:AWSS3TransferManagerUploadRequest! 
var transferManager: AWSS3TransferManager! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    uploadRequest = AWSS3TransferManagerUploadRequest() 
    transferManager = AWSS3TransferManager.default() 

} 

и попытался вызвать

func resumeTransfer() { 

    transferManager?.resumeAll(nil) 

} 

Но это не работает.

Заранее спасибо

+0

Вы проверили http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transfermanager.html#create-the-s3-transfermanager -client? – WestonE

+0

@WestonE Я так и не смог найти ответ на свой вопрос – DCDC

+0

У вас возникли проблемы с резюме для отдельных файлов? Из Дева руководства: ----- Чтобы возобновить передачу, позвоните и загрузке файлов, в зависимости от обстоятельств, и передать в приостановленном запросе: [transferManager загрузка: uploadRequest]; [transferManager download: downloadRequest]; ------ – WestonE

ответ

2

Оказывается, что Transfer Utility является правильным инструментом для выполнения этой задачи

func uploadData(data: NSData) { 

    let expression = AWSS3TransferUtilityUploadExpression() 
    expression.progressBlock = progressBlock 

    let transferUtility = AWSS3TransferUtility.default() 

    transferUtility.uploadData(
     data as Data, 
     bucket: "test", 
     key: "test/test.jpeg", 
     contentType: "image/jpeg", 
     expression: expression, 
     completionHander: completionHandler).continue(successBlock: { (task) -> AnyObject! in 
      if let error = task.error { 
       NSLog("Error: %@",error.localizedDescription); 

      } 
      if let exception = task.exception { 
       NSLog("Exception: %@",exception.description); 

      } 
      if let _ = task.result { 

       NSLog("Upload Starting!") 
       // Do something with uploadTask. 
      } 

      return nil; 
     }) 
} 

Таким образом, все вещи загрузки происходит в фоновом режиме, не придется беспокоиться о приложение быть убитым прошивкой, о проблемах сетей и т.д.

можно даже указать

configuration?.allowsCellularAccess = false 

AWSServiceConfiguration

, чтобы возобновить выполнение задания только при наличии Wi-Fi.

+0

Вы обнаружили, что TransferUtility возобновит большую загрузку с того места, где она остановилась, если произошел перерыв в сети? Потому что из моего тестирования и того, что я прочитал, он просто перезапускается с самого начала. – jeffjv

+0

Утилита переноса не работает для файлов, на которые потребуется более 50 минут для передачи –