ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python flask解决上传下载的问题

2019-08-07 22:57:28  阅读:198  来源: 互联网

标签:python 上传下载 filename flask result file print path data


  记录瞬间

 

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

 

代码:

#! /usr/bin/env python3
# coding:utf-8
import platform

from werkzeug.utils import secure_filename
from flask import Flask, jsonify, request, Response
import os

app = Flask(__name__)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 20 * 1024 * 1024   # 定义最大上传文件大小为:20M

ALLOWED_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 response


if __name__ == '__main__':
    app.run(debug=True, port=5002, host='0.0.0.0')
    # 默认127.0.0.1:5000,这里修改了地址和端口方便自己使用

 

调用方式:

# coding:utf-8
import requests
from urllib3 import encode_multipart_formdata


url = "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}"

 

标签:python,上传下载,filename,flask,result,file,print,path,data
来源: https://www.cnblogs.com/wozijisun/p/11318376.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有