首先请原谅我的英语不好(我说西班牙语)。
我正在尝试使用图片提交表单上传。
当我想发送普通数据(文本字符串)时,我这样做:
首先导入模块:
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模块上传图像?
感谢您阅读。
答案 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