2016-09-20 14 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とは何ですか? – Brosef

+0

私はこの回答を書いています –

答えて

0

を設定するためにあなたがすべきですset bucket policyとcors configを以下のように設定します。

  1. バケットを開き、右側の[プロパティ]をクリックします。
  2. クリックして権限タブ
  3. チェックアップロード/削除権限
  4. 編集バケットポリシー]ボタンをクリックし、この

    { 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
        "Sid": "AddPerm", 
        "Effect": "Allow", 
        "Principal": "*", 
        "Action": "s3:GetObject", 
        "Resource": "arn:aws:s3:::YOURBUCKET/*" 
    } 
    ] 
    } 
    
  5. クリックして編集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の設定が既に設定されているようです。しかし私のEdit Bucket Policyは空だったので、あなたが書いたものを追加しました。 ''リソース ''の場合: "arn:aws:s3 ::: YOURBUCKET/*" 'バケット名をすべて大文字で書きますか? – Brosef

+0

はい、YOURBUCKETをあなたのbucketnameに置き換えてください –

+0

これは正しい方向の一歩でしたが、問題を解決していない可能性があります。 – Brosef

関連する問題