使用Python的HTTP POST二进制文件:简洁的非pycurl示例?

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.

ars*_*ars 4

发布文件需要multipart/form-data编码,据我所知,没有简单的方法(即单行或其他方式)可以使用 stdlib 来执行此操作。但正如你提到的,那里有很多食谱。

尽管它们看起来很冗长,但您的用例表明您可能只需将其封装到函数或类中一次即可,而不必太担心,对吧?查看 ActiveState 上的配方并阅读评论以获取建议:

或者查看MultiPartFormPyMOTW 中的类,它看起来非常可重用:

我相信两者都处理二进制文件。