Flask之文件上传操作

Flask之文件上传操作

Python相关储备知识 – os模块
  • 首先我们需要知道, Python中的os模块是一种方便的使用操作系统的方法。所以在对文件/文件夹进行处理时, 它能发挥很大的作用, 这里就不多详细谈论os模块过多。

  • os.path.split(path)

    将path分割成目录和文件名以元组形式返回。

  • os.path.dirname(path)

    返回父路径/父文件夹路径

    • os.path.dirname(__ file __): 可以看出__file__表示了当前文件的path
  • os.path.join(path1[, path2[, …]])

    将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。

  • os.sep(path)

    os.sep会根据你所处的平台,自动地采用相应的分割符号。

  • os.path.exists(path)

    如果path存在,返回True;如果path不存在,返回False。

    • os.path.exists(app.config[‘UP_DIR’] + “users” + os.sep):
  • os.path.isfile(path)

    如果path是一个存在的文件,返回True。否则返回False。

  • os.path.isdir(path)

    如果path是一个存在的目录,则返回True。否则返回False。

  • os.path.getsize(path)

    返回path的文件的大小(字节)。

  • os.path.getatime(path)

    返回path所指向的文件或者目录的最后存取时间。

  • os.path.getmtime(path)

    返回path所指向的文件或者目录的最后修改时间。

  • os.makedirs(path)

    需要递归创建的目录。

    • os.makedirs(app.config[‘UP_DIR’] + “users” + os.sep)
  • os.remove

    删除文件夹。

  • os.chmod

    文件夹权限。

    • os.chmod(app.config[‘UP_DIR’] + “users” + os.sep, “rw”)
Flask上传文件
  • 服务端

    from flask import Flask, request
    from werkzeug.utils import secure_filename  # 上传文件文件名的安全获取
    import os
    
    
    app = Flask(__name__)
    
    # 文件上传目录
    app.config['UPLOAD_FOLDER'] = 'static/uploads'
    # 支持上传的文件格式
    app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}  # 集合类型
    # 支持上传的文件大小
    app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024
    
    '''
    文件上传
    三要素
        - 表单提交是POST 的请求
        - 表单 写入参数 enctype='multipart/form-data' 当上传内容非文本(MP3/MP4...)时候,如图片。需要将表单的设置成enctype编码格式
        - 使用上传属性 file 
    '''
    
    '''
    filename 获得上传文件名,secure_filename函数获得安全文件名,防止客户端伪造文件
    '''
    
    # 判断文件名是否是我们支持的格式
    def allowed_file(filename):
        return '.' in filename and filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
    
    
    @app.route('/upload', methods=['POST'])
    def upload():
        upload_file = request.files['image']
        print(upload_file.filename)
        if upload_file and allowed_file(upload_file.filename):
            filename = secure_filename(upload_file.filename)  # 注意: 中文命名文件会被截断只留下文件类型
            # filename = str(upload_file.filename)  # 不安全获取
            
            # 将文件保存到 static/uploads 目录,文件名同上传时使用的文件名
            # with open('%s/%s' % (app.config['UPLOAD_FOLDER'], filename), 'wb') as f:
            #     for line in upload_file:
            #         f.write(line)
            
            '''将文件夹和文件名连接在一起'''
            upload_file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename))
            return 'info is ' + request.form.get('info', '') + '. success'
        else:
            return 'failed'
    
    
    if __name__ == '__main__':
        app.run(port=5000, debug=True)
    
  • 注意: 用secure_filename获取中文文件名时,中文会被省略。

    原因:secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉。可以用不安全获取(filename)
    解决方法: 在专栏里Flask中secure_filename()获取中文文件名问题


  • 客户端

    import requests
    
    file_data = {'image': open('Python.jpg', 'rb')}
    
    user_info = {'info': 'Python'}
    
    r = requests.post("http://127.0.0.1:5000/upload", data=user_info, files=file_data)
    
    print(r.text)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值