下载文件就是 服务器向客户端发送文件名称与文件数据的过程。设计一个服务器程序,它被访问后向客户端发送一个文件的名称,客户端获取这个文件名称后,使用这个文件名称为参数再次访问服务器,服务器向客户端发送这个文件的数据,客户端获取数据后保存到本地,完整下载过程。
服务器程序server.py如下:
importflask
importos
app=flask.Flask(__name__)
@app.route("/")
defindex():
if"fileName"notinflask.request.values:
return"测试图像.jpg"
else:
data=b""
try:
fileName=flask.request.values.get("fileName")
iffileName!=""and \
os.path.exists(fileName): # 判断这个文件是否存在
fobj=open(fileName, "rb")
data=fobj.read()
fobj.close()
exceptExceptionaserr:
data=str(err).encode()
returndata
if__name__=="__main__":
app.run()
程序运行后网址为http://127.0.0.1:5000 。访问这个网址。执行index函数,程序返回"测试图像.jpg" 的文件名称。如果再次访问服务器,并带上 fileName 的参数,那么服务器接收这个文件名称后就使用 os.path.exists(fileName) 判断这个文件是否存在。如果存在,则读取该文件的数据返回给客户端;如果不存在,则返回空值给客户端。
客户端程序client.py如下:
importurllib.request
importurllib.parse
url="http://127.0.0.1:5000"
try:
html=urllib.request.urlopen(url)
html=html.read()
fileName=html.decode()
print("准备下载:"+fileName)
# ====================可使用urlretrieve函数简化====================
data=urllib.request.urlopen(url+"?fileName="+urllib.parse.quote(fileName))
data=data.read()
fobj=open("download"+fileName, "wb")
fobj.write(data)
fobj.close()
# ====================可使用urlretrieve函数简化====================
print("下载完毕:", len(data), "字节")
exceptExceptionaserr:
print(err)
这个程序先不带参数访问 http://127.0.0.1:5000,服务器会返回一个可以下载的文件名称给客户端,客户端获取这个文件名称 fileName ,之后再采用把这个文件名称放在地址栏后面的方式访问这个网站,即:
data=urllib.request.urlopen(url+"?fileName="+urllib.parse.quote(fileName))
服务器就把该文件的二进制数据发送给客户端。客户端接收后就保存到本地,名称是"download"+fileName。
在服务器所在的文件夹中放一个名称为"测试图像.jpg"的文件,先执行服务器程序建立Web网站,然后运行客户端,可以看到下载文件的过程,例如:可以子client终端看到
![](https://i-blog.csdnimg.cn/blog_migrate/75241db2e6152b66905e28d645ab29c2.png)
实际上,在 urllib.request 中专门有一个 urlretrieve 函数 用于从服务器获取文件并保存到本地。其使用方法是:
urllib.request.urlretrieve(url,localFile)
它从 URL 的网站下载数据保存到本地的 localFile 文件中。使用这个函数后
客户端程序client.py简化如下:
importurllib.request
importurllib.parse
url="http://127.0.0.1:5000"
try:
html=urllib.request.urlopen(url)
html=html.read()
fileName=html.decode()
print("准备下载:"+fileName)
urllib.request.urlretrieve(url+"?fileName="+urllib.parse.quote(fileName), "download"+fileName)
print("下载完毕:")
exceptExceptionaserr:
print(err)
下一篇文章:1.6 Web上传文件