尝试使用python请求将.wav文件上传到存储桶

时间:2019-07-10 12:22:03

标签: python python-requests google-cloud-storage python-3.7

我正在尝试将.wav文件(让我们说test.wav)上传到我的Google存储桶中,但是我遇到了一些问题:存储对象通过适当的“测试”上传。 wav'的名字,但里面只是我请求中的数据。存储桶中的contentType也会显示为application/x-www-form-urlencoded

我的存储桶具有公共读取/写入/删除权限,并且上传其他文件类型效果很好。通过邮递员上传这种方式也可以正常工作。


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进行转录。

感谢和问候。

2 个答案:

答案 0 :(得分:0)

找到了解决此问题的方法。我已改用here所示的方法,而不是使用请求模块。

这样做可以正确地上传文件,而不是将其数据上传到扩展名为.wav的文件。从而解决了我的问题。

答案 1 :(得分:0)

您正在将uploadType参数指定为media。这意味着请求的主体就是您要上传的对象的主体。但是,您将POST的body字段指定为字典,其中包含诸如“” acl“,” signature“和” file“之类的字段。看起来您正在尝试某种形式的POST,但是那不是媒体上传的样子。

以下是您使用“请求”将媒体样式上传到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)