如何在python 3中发送帖子文件(图像)

时间:2015-08-15 21:29:58

标签: python image python-3.x post

首先请原谅我的英语不好(我说西班牙语)。

我正在尝试使用图片提交表单上传。

当我想发送普通数据(文本字符串)时,我这样做:

首先导入模块:

import urllib.request

import urllib.parse

import http.cookiejar

准备Cookie和标题:

cj = http.cookiejar.CookieJar()
open = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
abriendo.addheaders = [("User-agent","Mozilla/5.0")]
urllib.request.install_opener(open)

对网址数据进行编码,我使用id(它是网页格式的HTML)

valor1 = {"username":"test1","password","hello"}
valor2 = urllib.parse.urlencode(valor1)
finalvalor = valor2.encode("UTF-8")

现在可以发送帖子数据(记住,这是一个带字符串数据的例子)

nav = urllib.request.urlopen(url,finalvalor)
navread = str(nav.read())

Url变量包含帖子网址

这项工作很好,但我发送图片时遇到了问题。

网络表单以此代码开头:

 <form enctype="multipart/form-data" onsubmit="return ver('espera');"
          action="example.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="5300000">
            <br><br>
            <div align="center" id="uploadFileContainer">
                <input size="25" id="uploadFile1" name="uploadFile1" type="file">

我做

dicc = {"uploadFile1":open("1.jpg","rb")}
nav = urllib.request.urlopen(url,dicc)
navread = str(nav.read())

出现此错误:

ValueError: Content-Length should be specified for iterable data of type <class 'dict'> {'uploadFile1': <_io.BufferedReader name='1.jpg'>

我尝试编码数据(enconde dicc如何正常url)但不工作(不发送任何数据)。我在googe上冲浪,我认为二进制数据需要编码为base64 ??

最后,问题是,如何使用urllib.request模块上传图像?

感谢您阅读。

2 个答案:

答案 0 :(得分:3)

在python中发送文件的简单方法是使用请求库:

import requests
files = {'file': open('1.jpg', 'rb')}
r = requests.post(url, files=files)
print(r.text)

cf requests' documentation。它基本上完成了你尝试做的所有事情,但却让它变得简单而且非常pythonic。

答案 1 :(得分:0)

模块请求工作正常,谢谢;)

最终代码:

files = {"uploadFile1":open("1.jpg","rb")}
r = requests.post(urlfotografia, files=files)
lecturanavegador = r.text