4

У меня возникла проблема с S3. После 3 часов устранения неполадок (пока я узнал о ролях IAM & удалось создать их) Я застреваю, пытаясь загрузить изображение профиля fb на амазонку S3.Загрузить jpg на S3: «Корпус запроса неожиданно завершен»

Мой код:

if let imageData = NSData(contentsOf: NSURL(string: url) as! URL) { 

          let fileName = ProcessInfo.processInfo.globallyUniqueString + ".jpg" 
          let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName) 
          let image = UIImage(data: imageData as Data) 
          let imageData = UIImageJPEGRepresentation(image!, 1.0)! 
          do { 
           try imageData.write(to: fileURL! as URL) 
          } catch _ { 
           self.log.error("Could not write to file.") 
          } 

          let transferManager = AWSS3TransferManager.default() 
          let uploadRequest = AWSS3TransferManagerUploadRequest() 
          uploadRequest?.bucket = "app-files" 
          uploadRequest?.key = "user-data/" + awsId! + "_primary_profile_picture.jpg" 
          uploadRequest?.body = fileURL! 

          transferManager.upload(uploadRequest!).continueWith(executor: AWSExecutor.mainThread(), block: { (task:AWSTask<AnyObject>) -> Any? in 

           if let error = task.error as? NSError { 
            if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) { 
             switch code { 
             case .cancelled, .paused: 
              break 
             default: 
              print("Error uploading: \(uploadRequest?.key) Error: \(error)") 
             } 
            } else { 
             print("Error uploading: \(uploadRequest?.key) Error: \(error)") 
            } 
            return nil 
           } 

           let uploadOutput = task.result 
           print("Upload complete for: \(uploadRequest?.key)") 
           return nil 
          }) 
         } 

** Проблема ** Я постоянно получаю ошибку The request body terminated unexpectedly от S3, которая выглядит следующим образом:

Error uploading: Optional("user-data/eu-west-1:xxxx-xxxx-xxxx-xxxx-xxxxxxxxxx_primary_profile_picture.jpg") 
Error: Error Domain=com.amazonaws.AWSS3ErrorDomain Code=0 "(null)" 
UserInfo={HostId=XXX, 
Message=The request body terminated unexpectedly, 
Code=IncompleteBody, 
RequestId=1485A0FFBD7819D7} 

Я не уверен, что происходит неверно, я отлаживал, и fileName, fileURL, imageData выглядит нормально

+3

Существует ошибка в версии 2.5.1 SDK, если вы можете отказаться от версии 2.5.0. – donkon

+0

Мне пришлось обновить из-за быстрой поддержки 3:/с 2.5 ничего не работало (cognito, dynamo, ...) –

+0

Поддержка Swift 3 была введена в 2.5.0. Изменение не должно нарушать ни одну из перечисленных служб ... теоретически. Можете ли вы дать некоторые подробности о том, как cognito и dynamo не работали? – donkon

ответ

7

Существует ошибка с 2.5.1 SDK, я объясню немного об этом here.

В принципе, AWSSignature создает неправильную подпись для загрузки ...

У вас есть два пути, чтобы получить вокруг него:

1) Revert к использованию 2.5.0, объявляя все стручки нужно явно так: (Edit: Я просто заметил, что вы не можете сделать это из-за СВИФТ проблемы Попробуйте вариант 2 возможно.)

pod 'AWSCore', '2.5.0' 
pod 'AWSCognito', '2.5.0' 
pod 'AWSLambda', '2.5.0' 
pod 'AWSSNS', '2.5.0' 
pod 'AWSS3', '2.5.0' 

2) Изменить код самостоятельно, чтобы решить эту проблему, пока Amazon не исправить. Все, что вам нужно сделать, это прокомментировать строки 783-785 в файле AWSCore/Authentication/AWSSignature.m - вы должны получить сообщение о том, что файл заблокирован, если вы попытаетесь, просто откройте его.

if (self.endOfStream) { 
    return NO; 
} 
+0

Шаг 2 решил. Спасибо :) –

+0

Извините, не могли бы вы объяснить, как получить доступ и изменить файл .m? это не заблокированная структура? –

+0

@JamesWhite при доступе к нему вас спросят, хотите ли вы разблокировать и отредактировать. Выберите «ОК» и продолжайте :) –

0

Действительно есть ошибка с текущим SDK AWSS3. Если вы используете cocoapods вы можете установить 2.5.0 (Swift 3 совместимый) с:

pod 'AWSS3', '2.5.0' 
+0

Это не работает, как: - 'AWSCore (= 2.5.1)' требуется 'подфайл' -' AWSCore (= 2.5.0) 'требуется' AWSS3 (2.5.0) ' -' AWSCore (= 2.5.1) 'требуется' AWSSNS (2.5.1) ' -' AWSCore (= 2.5.1) 'требуется' AWSCognito (2.5.1) ' -' AWSCore (= 2.5.1) 'требуется' AWSLambda (2.5.1) ' Другие модули должны быть 2.5.1 для работы (см. Последние комментарии от меня). –

+0

На самом деле я столкнулся с той же проблемой. Обновление Pod для всех связанных модулей AWS должно быть 2.5.0. Или, если вы предпочитаете удалять модули AWS, тогда установите pod install только с AWSS3, поскольку pod 'AWSS3', '2.5.0' будет устанавливать все модули AWS, как 2.5.0 –

+0

, пожалуйста, см. Мой другой комментарий.мои другие службы aws не будут работать в версии 2.5.0 из-за проблемы с cognito. я не могу понизить –

Смежные вопросы