zoukankan      html  css  js  c++  java
  • FastDFS结合Flask使用

    0、写在前面

    原本的文件上传下载都是自己结合网上的代码实现的,用起来扩展性不强,性能也不行。

    后来发现才知道有这种造好的轮子。扩展性强,性能也强。

    1、技术原理

    原理大概就是这张图了。其中tracker和storage需要使用docker安装,client有基于各种语言的实现,大概就是个接口文件。

    2、安装fastdfs

    安装完成的storage docker自带nginx,默认开启8888端口

    #docker搜索文件
    docker search fastdfs
    #拉取官方
    docker pull delron/fastdfs
    #查看镜像
    docker images
    #使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用)
    docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
    #使用docker镜像构建storage容器(存储服务器,提供容量和备份服务)
    docker run -d --network=host --name storage -e TRACKER_SERVER=ip:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

    3、安装fdfs-client-py

    1.先安装依赖包mutagen、requests

    2.直接安装会报错,官方下载压缩包 https://github.com/JaceHo/fdfs_client-py

    3.打开  storage_client.py  注释 12行 如图所示:

    4.把fdfs_client文件夹直接复制到python环境的lib文件夹里

     4、在python中连接使用fastdfs

    conf文件需要改动两处,base_path=日志存放路径,tracker_server=服务器IP:22122

    # connect timeout in seconds
    # default value is 30s
    # Note: in the intranet network (LAN), 2 seconds is enough.
    connect_timeout = 5
    
    # network timeout in seconds
    # default value is 30s
    network_timeout = 60
    
    # the base path to store log files
    base_path = C://Users//Administrator//Desktop//py//test//test1
    
    # tracker_server can ocur more than once for multi tracker servers.
    # the value format of tracker_server is "HOST:PORT",
    #   the HOST can be hostname or ip address,
    #   and the HOST can be dual IPs or hostnames seperated by comma,
    #   the dual IPS must be an inner (intranet) IP and an outer (extranet) IP,
    #   or two different types of inner (intranet) IPs.
    #   for example: 192.168.2.100,122.244.141.46:22122
    #   another eg.: 192.168.1.10,172.17.4.21:22122
    
    tracker_server = 61.6.192.148:22122
    #tracker_server = 192.168.0.197:22122
    
    #standard log level as syslog, case insensitive, value list:
    ### emerg for emergency
    ### alert
    ### crit for critical
    ### error
    ### warn for warning
    ### notice
    ### info
    ### debug
    log_level = info
    
    # if use connection pool
    # default value is false
    # since V4.05
    use_connection_pool = false
    
    # connections whose the idle time exceeds this time will be closed
    # unit: second
    # default value is 3600
    # since V4.05
    connection_pool_max_idle_time = 3600
    
    # if load FastDFS parameters from tracker server
    # since V4.05
    # default value is false
    load_fdfs_parameters_from_tracker = false
    
    # if use storage ID instead of IP address
    # same as tracker.conf
    # valid only when load_fdfs_parameters_from_tracker is false
    # default value is false
    # since V4.05
    use_storage_id = false
    
    # specify storage ids filename, can use relative or absolute path
    # same as tracker.conf
    # valid only when load_fdfs_parameters_from_tracker is false
    # since V4.05
    storage_ids_filename = storage_ids.conf
    
    
    #HTTP settings
    http.tracker_server_port = 80
    
    #use "#include" directive to include HTTP other settiongs
    ##include http.conf
    client.conf
    from fdfs_client.client import Fdfs_client
    
    client = Fdfs_client('C:\Users\Administrator\Desktop\py\test\test1\client.conf')
    
    ret = client.upload_by_filename('C:\Users\Administrator\Desktop\py\test\test1\zzzz.jpg')
    
    print(ret)

    5、在Flask中使用fastdfs

    # -*- coding: UTF-8 -*-
    from flask import  Flask,render_template,request,send_file
    from fdfs_client.client import Fdfs_client
    import io
    
    app = Flask(__name__)
    
    def getFileExt(filename):
        return ('%s' % filename.split('.')[-1]).lower()
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    #上传,通用下载,适用于图片等公开的文件
    @app.route('/upload',methods=['GET','POST'])
    def upload():
        print(request.files['_file'])
        saved_file_name = request.files['_file'].filename
        client = Fdfs_client('C:\Users\Administrator\Desktop\py\test\test1\client.conf')
        #二进制存储
        ret = client.upload_by_buffer(request.files['_file'].read(),getFileExt(saved_file_name))
        saved_file = 'http://61.6.192.148:8888/'+ ret['Remote file_id']
        return render_template('index.html',ret=ret,saved_file=saved_file,saved_file_name=saved_file_name)
    
    #下载,可在fastfds的storage中的配置文件配置只允许后端访问,适用于非公开的文件
    @app.route('/download/',methods=['GET','POST'])
    def download():
        file_id = request.args['file_id'].replace('\\','/')
        print(file_id)
        client = Fdfs_client('C:\Users\Administrator\Desktop\py\test\test1\client.conf')
        #二进制读取
        saved_file_buffer = client.download_to_buffer(file_id)
        return send_file(io.BytesIO(saved_file_buffer['Content']),
                         attachment_filename=file_id,)
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        文件上传:<br>
        <form enctype="multipart/form-data" method="post" action="/upload">
            <input type="file" name="_file"/>
            <input type="submit" name="submit">
        </form>
        <br>
        <a href="{{ saved_file }}">{{saved_file_name }}</a>
        <br>
        {{ ret }}
    
    </body>
    </html>
    index.html
  • 相关阅读:
    低调 、隐忍、善良应是最应该修炼的
    达内C++培训课程
    这三天低效率开发的总结,我都做了些什么啊?
    linux sysfs(1)
    编码问题
    Linux中的system函数的实现和解释
    北京邮电大学 程序设计课程设计 电梯 文件输入版本(已调试,大致正确运行==)
    "Dallas" CTP3 发布通告
    结合使用PowerPivot 和 "Dallas" CTP3
    Windows Azure 解决方案系列: 能源监测减少支出,通过托管平台拓展业务
  • 原文地址:https://www.cnblogs.com/cx59244405/p/14086126.html
Copyright © 2011-2022 走看看