我尝试通过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授权令牌?因为我从终端获得了令牌。我把它放在标题中。我想它还可以吗?
答案 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)
}