2016-09-20 23 views
0

我想使用Swift將文件上傳到S3,但我無法建立連接。我如何查看來自S3的錯誤細節,找出我的上傳嘗試失敗的原因。如何在swift中無法連接到S3時查看錯誤

的參數,我傳遞給S3:

["X-Amz-Date": 20160916T010311Z, 
"X-Amz-Signature":qr647bMEA9M8LeBVqkJLcvEIO4g=, 
"trackURL": https://bucketname.s3.amazonaws.com/fileID, 
"key": Track50, "acl": public-read, 
"policy": wtLepKMeghI3rt1UeikLoQcNTYtMDktMTBUMTc6NDE6MTJaIiwgImNvbmRpdGlvbnMiOiBbeyJhY2wiOiAicHVibGljLXJlYWQifSwgeyJDb250ZW50LVR5cGUiOiAibTRhIn0sIHsiYnVja2V0IjogImZ1eZEaJKYzeDgZwz3lOPtys5B0MigIwImv2OpQm3ylP==, 
"Content-Type": m4a, 
"AWSAccessKeyId": XXXXXXXXXXXX, 
"X-Amz-Credential": AWSAccessKeyId/2016915/us-west-1/s3/aws4_request, 
"X-Amz-Algorithm": AWS4-HMAC-SHA256] 

錯誤我找回:

response:<NSHTTPURLResponse: 0x7f8713ed7090> { URL: https://bucketname.s3.amazonaws.com/ } { status code: 400, headers { 
    Connection = close; 
    "Content-Type" = "application/xml"; 
    Date = "Fri, 16 Sep 2016 03:36:42 GMT"; 
    Server = AmazonS3; 
    "Transfer-Encoding" = Identity; 
    "x-amz-id-2" = "rzvVE96GNdVadls1wGigWYVsyoowITSI9sqWuEQ2IYIYsPdlV8HDlKQa0APQjwJ3Yxikp9L1ozU="; 
    "x-amz-request-id" = 196F566C41386F62; 
} } 
ErrorReason(code: -2, message: "http error code 400") 

代碼設置請求

protocol FileUpload: Requestable { 
var fileURL: NSURL { get } 
var mimeType: String { get } 
var request: NSURLRequest { get } 
} 

extension FileUpload { 
    var request: NSURLRequest { 
     let URLString = "https://bucketname.s3.amazonaws.com" 
     let URL = NSURL(string:URLString) 
     let r = NSMutableURLRequest(URL:URL!) 
     r.HTTPMethod = method.rawValue 
     let boundary = generateBoundaryString() 
     r.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
     r.HTTPBody = createBodyWithParameters(params, boundary: boundary) 
     return r 
    } 

    func createBodyWithParameters(parameters: [String: AnyObject]?, boundary: String) -> NSData { 
     let body = NSMutableData() 

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.appendString("--\(boundary)\r\n") 
       body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
       body.appendString("\(value)\r\n") 
      } 
     } 

     let data = NSData(contentsOfURL: fileURL) 

     body.appendString("--\(boundary)\r\n") 
     body.appendString("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileURL.lastPathComponent!)\"\r\n") 
     body.appendString("Content-Type: \(mimeType)\r\n\r\n") 
     body.appendData(data!) 
     body.appendString("\r\n") 
     body.appendString("--\(boundary)--\r\n") 
     return body 
    } 

    func handleResponse(data: NSData?, response: NSURLResponse?, error: NSError?) -> Result<Serialize> { 
    if let httpResponse = response as? NSHTTPURLResponse { 
     print("response:\(httpResponse)") 

     if httpResponse.statusCode == 200 { 
      do { 
       let json: JSON = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) 
       return Serialize.instantiate(json) 
      } 
      catch { 
       print("Error thrown. Could not parse JSON: '\(error)'") 
       return Result(error:ErrorReason(code: -1, message: "invalid json stream \(error)")) 
      } 
     } 
     print("error under handle response") 
     return Result(error:ErrorReason(code: -2, message: "http error code \(httpResponse.statusCode)")) 
    } 
    return Result(error: ErrorReason(code:-2, message: "Unable to reach server")) 

} 
+0

您是否設置了桶策略和cors conf? –

+0

我沒有。什麼是cors conf? – Brosef

+0

我正在爲此編寫一個答案 –

回答

0

你應該設置桶策略和Cors配置如下;

  1. 打開您的存儲桶並單擊右側的屬性。
  2. 點擊權限選項卡
  3. 檢查上傳/刪除權限
  4. 單擊編輯桶政策按鈕,寫這個

    { 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
        "Sid": "AddPerm", 
        "Effect": "Allow", 
        "Principal": "*", 
        "Action": "s3:GetObject", 
        "Resource": "arn:aws:s3:::YOURBUCKET/*" 
    } 
    ] 
    } 
    
  5. 點擊edit CORS配置按鈕,寫這行

    <?xml version="1.0" encoding="UTF-8"?> 
    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    <AllowedMethod>PUT</AllowedMethod> 
    <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
    </CORSConfiguration> 
    
+0

好吧,看起來我的cors配置已經設置好了(自從我上次完成此任務以來已經有一段時間了)。但我的編輯桶策略是空的,所以我添加了你寫的內容。對於「資源」:「arn:aws:s3 ::: YOURBUCKET/*」'我應該在所有大寫字母中寫下我的存儲桶名稱嗎? – Brosef

+0

是的,將YOURBUCKET替換爲您的存儲桶名稱 –

+0

這可能是朝着正確方向邁出的一步,但並未解決問題。 – Brosef