si2*_*19e 5 python binary post http
我有兴趣编写一个简短的python脚本,它通过POST请求将一个简短的二进制文件(.wav/.raw音频)上传到远程服务器.
我用pycurl完成了这个,这使得它非常简单并且产生了一个简洁的脚本; 不幸的是,它还要求最终用户安装了pycurl,我不能依赖它.
我在其他帖子中也看到了一些仅依赖于基本库,urllib,urllib2等的例子,但这些通常看起来相当冗长,这也是我想要避免的.
我想知道是否有任何简洁的例子不需要使用外部库,并且第三方可以快速方便地理解 - 即使他们不是特别熟悉python.
我目前使用的是什么样的,
def upload_wav( wavfile, url=None, **kwargs ):
"""Upload a wav file to the server, return the response."""
class responseCallback:
"""Store the server response."""
def __init__(self):
self.contents=''
def body_callback(self, buf):
self.contents = self.contents + buf
def decode( self ):
self.contents = urllib.unquote(self.contents)
try:
self.contents = simplejson.loads(self.contents)
except:
return self.contents
t = responseCallback()
c = pycurl.Curl()
c.setopt(c.POST,1)
c.setopt(c.WRITEFUNCTION, t.body_callback)
c.setopt(c.URL,url)
postdict = [
('userfile',(c.FORM_FILE,wavfile)), #wav file to post
]
#If there are extra keyword args add them to the postdict
for key in kwargs:
postdict.append( (key,kwargs[key]) )
c.setopt(c.HTTPPOST,postdict)
c.setopt(c.VERBOSE,verbose)
c.perform()
c.close()
t.decode()
return t.contents
Run Code Online (Sandbox Code Playgroud)
这不是确切的,但它给你一般的想法.它工作得很好,第三方理解起来很简单,但它需要pycurl.
发布文件需要multipart/form-data编码,据我所知,没有简单的方法(即单行或其他方式)可以使用 stdlib 来执行此操作。但正如你提到的,那里有很多食谱。
尽管它们看起来很冗长,但您的用例表明您可能只需将其封装到函数或类中一次即可,而不必太担心,对吧?查看 ActiveState 上的配方并阅读评论以获取建议:
或者查看MultiPartFormPyMOTW 中的类,它看起来非常可重用:
我相信两者都处理二进制文件。