如何使用标准Python库通过HTTP上传文件

4 投票
2 回答
3604 浏览
提问于 2025-04-16 23:36

我现在正在使用PycURL来触发Jenkins中的构建,方法是向一个特定的URL发送请求。相关的代码如下:

curl = pycurl.Curl()
curl.setopt(pycurl.URL, url)
# These are the form fields expected by Jenkins
data = [
        ("name", "CI_VERSION"),
        ("value", str(version)),
        ("name", "integration.xml"),
        ("file0", (pycurl.FORM_FILE, metadata_fpath)),
        ("json", "{{'parameter': [{{'name': 'CI_VERSION', 'value':"
            "'{0}'}}, {{'name': 'integration.xml', 'file': 'file0'}}]}}".
                format(version,)),
        ("Submit", "Build"),
        ]
curl.setopt(pycurl.HTTPPOST, data)
curl.perform()

如你所见,发送请求时有一个参数('file0')是一个文件,这个参数的类型是pycurl.FORM_FILE,表示它是一个文件。

我该如何用标准的Python库来替代PycURL呢?

2 个回答

1
u = urllib.urlopen(url, data=urllib.urlencode(
                             {'name': 'CI_VERSION', 
                              'value': str(version),
                              'file0': open(metadata_fpath).read(),
                               etc. 
                               etc.})) 

你可以使用 urlliburllib2 来实现这个功能。上面是一个发送 POST 请求的简单示例。

1

标准的Python库不支持multipart/form-data格式,这种格式是用来通过POST请求上传文件的。

不过,有一些解决方案,比如这个链接:http://code.activestate.com/recipes/146306-http-client-to-post-using-multipartform-data/

撰写回答