Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用标准Python库通过HTTP发布文件_Python_Http_Http Post - Fatal编程技术网

如何使用标准Python库通过HTTP发布文件

如何使用标准Python库通过HTTP发布文件,python,http,http-post,Python,Http,Http Post,我目前正在使用PycURL通过发布到某个URL来触发Jenkins中的构建。相关代码如下所示: 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.

我目前正在使用PycURL通过发布到某个URL来触发Jenkins中的构建。相关代码如下所示:

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()
如您所见,post参数('file0')之一是一个文件,如参数类型pycurl.FORM_file所示

如何用标准Python库替换PycURL的使用

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

您可以使用/。以上是发送
POST
请求的一个最小示例。

标准python库不支持通过POST请求发送POST文件所需的多部分/表单数据


有一些诀窍,例如

这不能解决发布文件的问题,是吗?使用urllib*,发布直字符串参数应该足够简单。我认为这对于发布文件非常有效。只需使用
open(metadata\u fpath).read()
作为键
file0
的攻击值。我将把这个添加到答案中。这与seriyPS在他的答案中所说的(发布文件需要多部分/表单数据)如何对应?还可以看到这个bug,它基本上说stdlib必须扩展以支持通过POST上传文件。它甚至包括一个补丁来实现这种支持。我相信我以前使用过这种方法。但是,它可能有局限性——如果文件小于某个大小,或者是文本?我以前听说过关于
poster
urllib3
(都在该报告中链接)的好消息,因此如果raw post data方法失败,您可以尝试一下。我正试图使用此方法向Jenkins发布一个文件,但失败了。请参阅我关于这个特定问题的问题:。纯Python软件包可以吗?还是您真的想单独使用标准库?@piotrdorgost好吧,这个问题实际上是关于标准库的,但我想您可以发布一个纯Python解决方案供参考。我可以通过图书馆自己解决这个问题。这就是我想推荐的。看见