我正在尝试上传一个.wav文件(比方说test.wav)到我的谷歌存储桶中,但是我遇到了一些问题:一个使用适当的'test.wav‘名称上传的存储对象,但里面只是我请求中的数据。存储桶中的contentType也显示为application/x-www-form-urlencoded。
我的存储桶有公共的读/写/删除权限,上传其他类型的文件也没问题。这种上传方式也可以通过postman很好地工作。
url = "https://www.googleapis.com/upload/storage/v1/b/<bucket_name>/o"
payload ={
"acl":"public-read",
"file":open('test.wav'),
"signature":signature,
"policy":policy
}
headers={"contentType":"audio/wav"}
params={"uploadType":"media","name":"test.wav"}
response = requests.post(url,data=payload,headers=headers,params=params)
print(response.text)目前,我得到了以下错误:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position
4420: character maps to <undefined>我也尝试过scipy.io.wavfile.read()和pydub.AudioSegment(),但它们也不适用于我。
理想情况下,我希望该文件能够成功上传,并可通过google的STT进行转录。
谢谢并致以问候。
发布于 2019-07-12 17:48:46
已找到解决此问题的方法。我没有使用requests模块,而是改用here所示的方法。
这样做会正确地上载文件,而不是将其数据上载到扩展名为.wav的文件。从而解决了我的问题。
发布于 2019-07-13 01:35:41
您正在将uploadType参数指定为media。这意味着请求的主体就是您正在上传的对象的主体。但是,您将帖子的正文字段指定为包含""acl“”、“"signature”“和”"file“”等字段的字典。看起来您可能正在尝试一种表单样式的帖子,但这不是媒体上传的样子。“
下面是如何使用请求将媒体样式上传到GCS:
import requests
url = "https://www.googleapis.com/upload/storage/v1/b/<bucket_name>/o"
headers = {
"acl": "public-read",
"Authorization": "Bearer ...",
"Content-Type": "audio/wav",
}
params = {"uploadType": "media", "name": "test.wav"}
with open('test.wav', 'rb') as file:
r = requests.post(url, params=params, headers=headers, data=file)
print(r.text)https://stackoverflow.com/questions/56970601
复制相似问题