Alamofire无法将文件上传到Google云端存储

时间:2017-07-28 03:34:16

标签: ios swift google-cloud-storage alamofire

我尝试通过Alamofire将媒体文件上传到GCS(Google云端存储)。下面是代码。

   let soundUrl = URL(fileURLWithPath: dirPaths.appending("/audio-file.wav"))

    let headers: HTTPHeaders = [
        "Content-Type": "audio/wav",
        "Authorization": "Bearer <MYTOKEN>"
    ]


    Alamofire.upload(
        multipartFormData: { multipartFormData in
            multipartFormData.append(soundUrl, withName: "name")
    },
        to: "https://www.googleapis.com/upload/storage/v1/b/<folder-name>/o?uploadType=media?&name=audio-file.wav",method: .post, headers: headers,
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                upload.responseString(completionHandler: { (response) in
                    print(response)
                })

            case .failure(let encodingError):
            print(encodingError)

            }

         }
    )

但它没有取得成功。

我在Postman.尝试了同样的事情,它运作良好。。我检查了来自https://requestb.in的帖子请求,两者看起来相似。

不确定问题出在哪里。

更新 -

我是否需要获取iOS授权令牌?因为我从终端获得了令牌。我把它放在标题中。我想它还可以吗?

2 个答案:

答案 0 :(得分:1)

您已设置uploadType=media,但看起来您正在进行分段上传。如果您只想上传媒体,请不要进行分段上传。如果您确实要进行分段上传,请设置uploadType=multipart。让分段上传工作将要求您的上传包含两部分,第一部分必须是描述资源的JSON文档,第二部分是媒体。

这里描述了这两种上传机制:https://cloud.google.com/storage/docs/json_api/v1/how-tos/multipart-upload

答案 1 :(得分:0)

由于OAuth像每小时一样到期,我们需要从设备中获取它。一旦我有了令牌,我就能从以下代码上传文件。

let soundUrl = URL(fileURLWithPath: dirPaths.appending("/audio-file.wav"))

let headers: HTTPHeaders = [
    "Content-Type": "audio/wave",
    "Authorization": "Bearer \(self.authorizationKey)"
]        
    Alamofire.upload(soundUrl, to: "https://www.googleapis.com/upload/storage/v1/b/<FOLDER>/o?uploadType=media&name=audio-file.wav",method: HTTPMethod.post, headers: headers).responseJSON{ response in
    print(response)
}