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 
          }) 
         } 

** **问题 我不断收到来自S3一The request body terminated unexpectedly错误,看起来像这样:

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

SDK v2.5.1中存在一个bug,如果可以的话,尝试降级到2.5.0。 – donkon

+0

我不得不升级,因为迅速3支持:/ with 2.5没有任何工作(认知,发电机,...) –

+0

斯威夫特3支持在2.5.0中引入该变化不应该打破任何列出的服务...理论上。你能否提供一些关于认知和发电机不起作用的细节? – donkon

回答

7

没有与2.5.1 SDK中的错误,我解释一下here一点。

基本上,AWSSignature创建上传的签名错误...

你有两种方法来解决它:

1)还原成使用2.5.0通过声明所有你需要的豆荚明确像这样:(编辑:我刚刚注意到你不能这样做,因为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)自行修改代码来解决这个问题,直到亚马逊修复它。您需要做的只是在AWSCore/Authentication/AWSSignature.m文件中注释掉第783-785行 - 如果您尝试解锁文件,您应该会看到文件已被锁定的消息。

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

第2步解决了它。谢谢:) –

+0

对不起,能否解释一下如何访问和修改.m文件?它不是一个锁定的框架? –

+0

@JamesWhite在访问它时会询问您是否要解锁和编辑。选择“确定”并继续:) –

0

确实有一个错误与当前的AWSS3 SDK。如果你正在使用的CocoaPods可以安装2.5.0(SWIFT 3)兼容:

pod 'AWSS3', '2.5.0' 
+0

这是行不通的,因为: - 'Podfile'需要的'AWSCore(= 2.5.1)' - AWSS3所需的AWSCore(= 2.5.0) 'AWSCNS(2.5.1)'所要求的'AWSCore(= 2.5.1)'''''''''需要'AWSCore(= 2.5.1)' - AWSLambda(2.5.1)' 需要AWSCore(= 2.5.1)',其他模块必须是2.5.1才能工作(请参阅我的最新评论)。 –

+0

我其实遇到了同样的问题。所有相关AWS pod的Pod更新为2.5.0。或者,如果您希望移除AWS pod,然后只安装AWSS3作为pod'AWSS3','2.5.0'将安装所有AWS pod作为2.5.0 –

+0

,请参阅我的其他评论。由于cognito问题,我的其他aws服务将无法在2.5.0中运行。我无法降级 –