博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python flask解决上传下载的问题
阅读量:5166 次
发布时间:2019-06-13

本文共 3848 字,大约阅读时间需要 12 分钟。

  记录瞬间

 

最近为了解决一些新的需求,简单介入了flask对文件的上传和下载的方法,并分别使用python和curl模拟发送

 

代码:

#! /usr/bin/env python3# coding:utf-8import platformfrom werkzeug.utils import secure_filenamefrom flask import Flask, jsonify, request, Responseimport osapp = Flask(__name__)UPLOAD_FOLDER = 'upload'app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDERapp.config['MAX_CONTENT_LENGTH'] = 20 * 1024 * 1024   # 定义最大上传文件大小为:20MALLOWED_EXTENSIONS = set(['txt', 'png', 'jpg', 'xls', 'JPG', 'PNG', 'zip', 'gif', 'GIF'])run_path = "./"                         # 根据不同的操作系统,定义基础运行路径if platform.system() == "Linux":    run_path = r'/opt/AutoUpload/'if platform.system() == "Windows":    run_path = r'D:/PythonWorkSpace/'msg = 'niGEin!'# 用于判断文件后缀def allowed_file(filename):    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS# 上传文件-upload-file@app.route('/uf', methods=['POST'], strict_slashes=False)def api_upload():    file_dir = run_path + UPLOAD_FOLDER    if not os.path.exists(file_dir):        os.makedirs(file_dir)    f = request.files['file']                             # 获取上传文件    print(request.values.get("filePath"))        fname = secure_filename(f.filename)    ext = fname.rsplit('.', 1)[1]                          # 获取文件后缀    f.save(os.path.join(file_dir, fname))                  # 保存文件到upload目录    if ext == 'zip':        pass    return jsonify({
"errno": "000000", "errmsg": u"success"})# 下载文件-download-file@app.route('/df', methods=['GET', 'POST'])def api_download(): if request.method == 'GET': fullfilename = request.json['fileName'] print(fullfilename) filepath = run_path + 'tools/' + fullfilename print(filepath) if not os.path.isfile(filepath): print("nononononono!!!") return # 普通下载 # response = make_response(send_from_directory(filepath, fullfilename, as_attachment=True)) # response.headers["Content-Disposition"] = "attachment; filename={}".format(filepath.encode().decode('latin-1')) # return response # 流式读取 def send_file(): store_path = filepath with open(store_path, 'rb') as targetfile: while 1: data = targetfile.read(1 * 1024 * 1024) # 每次读取1M if not data: break yield data response = Response(send_file(), content_type='application/octet-stream') response.headers["Content-disposition"] = 'attachment; filename=%s' % fullfilename return responseif __name__ == '__main__': app.run(debug=True, port=5002, host='0.0.0.0') # 默认127.0.0.1:5000,这里修改了地址和端口方便自己使用

 

调用方式:

# coding:utf-8import requestsfrom urllib3 import encode_multipart_formdataurl = "http://localhost:5002/up"data = {            "filePath": "123123123"        }header = {}data['file'] = ("xx.zip", open(r"./basedir/xx.zip", 'rb').read())encode_data = encode_multipart_formdata(data)data = encode_data[0]header['Content-Type'] = encode_data[1]try:    result = requests.request(method='POST', url=url, headers=header, data=data, timeout=(3, 100))    if "true" in result.text:        analyse_json = result.json()        print("向服务器发送文件并解压成功")        result_path = analyse_json["data"]        print("服务器端的地址为 {}".format(result_path))    else:        print("向服务器发送文件并解压Failed {}".format(result.text))except Exception as e:    print("执行发送数据失败.{}".format(e))#--------------------------------------------url = "http://localhost:5002/df"data = {            "fileName": "xx.jar"        }result = requests.request(method="GET", url=url, json=data, stream=True)f = open(data['fileName'], "wb")for chunk in result.iter_content(chunk_size=512):    if chunk:        f.write(chunk)#---------------------------------------------

 

使用curl命令进行发送文件的方式:

 

curl ${URL} -X POST -F "file=@${app_path}/${APP_NAME}.zip"  -F "ip1=${IP}" -F "ip2=${get_ip}" -F "port=${port}" -F "num=${num}"

 

转载于:https://www.cnblogs.com/wozijisun/p/11318376.html

你可能感兴趣的文章
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>
Linux 下常见目录及其功能
查看>>
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
4.AE中的缩放,书签
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
iOS开发 runtime实现原理以及实际开发中的应用
查看>>
android 学习资源网址
查看>>
qt安装遇到的错误
查看>>
java:Apache Shiro 权限管理
查看>>
objective c的注释规范
查看>>
FreeNas安装配置使用
查看>>