Загрузить JPG на S3: "Тело запроса неожиданно прервано"
У меня проблема с S3. После 3 часов поиска неисправностей (тем временем я узнал о ролях IAM и сумел их создать), я застрял, пытаясь загрузить фотографию профиля fb в amazon 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, кажется, в порядке
2 ответа
В 2.5.1 SDK есть ошибка, об этом я немного объясню.
По сути, AWSSignature создает неправильную подпись для загрузки...
У вас есть два способа обойти это:
1) Вернитесь к использованию 2.5.0, объявив все необходимые вам модули, например, так: (Edit: я только что заметил, что вы не можете сделать это из-за проблемы SWIFT. Попробуйте вариант 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;
}
Действительно, есть ошибка с текущим AWSS3 SDK. Если вы используете cocoapods, вы можете установить 2.5.0 (Swift 3-совместимый) с:
pod 'AWSS3', '2.5.0'