2014-09-10 177 views
2

我想上传一个音频文件到clyp.it网络服务。这里描述的API:http://clyp.it/api。相关摘录如下:Python请求发布clyp.it上传文件

Uploads are done via a multipart/form-data POST. Consider the following form: 
<form action="http://upload.clyp.it/upload" enctype="multipart/form-data" method="post"> 
    <input type="file" name="audioFile"> 
    <input type="submit" value="Send to Clyp"> 
</form> 

It will create a request that looks like this: 
POST http://upload.clyp.it/upload HTTP/1.1 
Host: upload.clyp.it 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------21632794128452 
Content-Length: 5005 
-----------------------------21632794128452 
Content-Disposition: form-data; name="audioFile"; filename="MyAudioFile.mp3" 
Content-Type: audio/mpeg 
(Audio file data goes here) 

我能够通过创建一个html文件,并在上面的表单块中上传文件。我希望能够通过python上传这个文件。我一直在努力这样做,使用“请求”模块()

我已经试过这样:

clyp_file_upload_url = 'https://upload.clyp.it/upload' 
music_mp3 = open('/home/jinal/Downloads/music.mp3', 'rb') 
send_files = {'audioFile':music_mp3} 
r = requests.post(clyp_file_upload_url, files=send_files) 
print(r.status_code) 

它返回一个通用的500错误。我怀疑我没有正确构建发布请求。我应该怎么做?

回答

3

您需要设置Content-Typefiles字典参数requests.post()每个上传的文件,即

clyp_file_upload_url = 'http://upload.clyp.it/upload' 
music_mp3 = open('/home/jinal/Downloads/music.mp3', 'rb') 
send_files = {'audioFile': ('music.mp3', music_mp3, 'audio/mpeg')} 
r = requests.post(clyp_file_upload_url, files=send_files) 
print(r.status_code) 

>>> from pprint import pprint 
>>> pprint(r.json()) 
{u'AudioFileId': u'5jahwd0y', 
u'Description': u'#Me #TestOfMp3File #Other', 
u'Duration': 12.408, 
u'Latitude': None, 
u'Longitude': None, 
u'Message': None, 
u'Mp3Url': u'http://a.clyp.it/5jahwd0y.mp3', 
u'OggUrl': u'http://a.clyp.it/5jahwd0y.ogg', 
u'PlaylistId': u'0kpvbr1j', 
u'PlaylistUploadToken': u'd5ec65e0e197d5fe45e7b18371a2e1f0', 
u'SecureMp3Url': u'https://s3.amazonaws.com/a.clyp.it/5jahwd0y.mp3', 
u'SecureOggUrl': u'https://s3.amazonaws.com/a.clyp.it/5jahwd0y.ogg', 
u'Successful': True, 
u'Title': u'Me - Test of MP3 File', 
u'Url': u'http://clyp.it/5jahwd0y'} 
  • 注意,URI方案应该是http,不https
+0

它的工作原理!谢谢。它需要你说的内容类型。 – 2014-09-10 14:45:18

1

它看起来像是关于请求格式的一些假设。我猜想错误可能是由缺少文件名引起的。试试:

send_files = {'audioFile': ('music.mp3', music_mp3)} 

看看它是否能解决你的问题。

+0

文件名是必需的,但它也需要内容类型。谢谢回答。 – 2014-09-10 14:46:17