美文网首页
FLASK 文件上传 --- 原生实现

FLASK 文件上传 --- 原生实现

作者: MoonMonsterss | 来源:发表于2018-09-01 22:59 被阅读13次

    FLASK 文件上传 --- 原生实现

    使用Flask的原有的功能实现文件(图片)上传功能。
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # Created by Flynn on 2018-08-29 14:28
    
    import os
    
    from flask import Blueprint
    from flask import request, render_template, send_from_directory, url_for, flash
    from werkzeug.utils import secure_filename
    
    bp = Blueprint('upload1', __name__, url_prefix='/upload1/')
    
    UPLOAD_FOLDER = './uploads'
    ALLOWED_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif']
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB
    
    
    def is_allowed_files(filename):
        """
        判断是否是文件,以及文件格式
        :param filename:
        :return:
        """
        # 判断是否有.
        # 判断 '.' 后的文件格式是否存在可上传的文件格式中
        return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
    
    
    @bp.route('/uploads/<filename>', methods=['GET', 'POST'])
    def uploaded_file(filename):
        # 第一个参数保存文件的文件夹路径
        # 第二个参数是文件名
        # 返回文件的可访问路径
        file_url = send_from_directory(UPLOAD_FOLDER, filename)
        return file_url
    
    
    @bp.route('/', methods=['GET', 'POST'])
    def index():
        file_url = 'uploads/logo.png'
    
    if request.method == 'POST':
        # 从form中取得file对象
        file = request.files['file']
        length = len(file.read())
        if length > MAX_CONTENT_LENGTH:
            flash('文件太大,请重新上传!')
            return render_template('upload1/index.html')
    
        # 判断文件是否存在
        # 判断上传文件类型是否符合要求
        if file and is_allowed_files(file.filename):
            # 返回安全的文件名称
            # 具体解释ctrl+左键,进去看源码
            filename = secure_filename(file.filename)
            # 保存文件
            file.save(os.path.join(UPLOAD_FOLDER, filename))
            # 获得文件的可访问路径
            file_url = url_for('upload1.uploaded_file', filename=filename)
            print('file_url1 = ', file_url)  # 打印结果: /upload1/uploads/1525269617847e958494e4a.jpg
            # file_url = send_from_directory(UPLOAD_FOLDER, filename)
            # print('file_url2 = ', file_url)  # 打印结果: <Response streamed [200 OK]>
    context = {}
    context['file_url'] = file_url
    return render_template('upload1/index.html', **context)
    
    
    <body>
    <form method="POST" enctype="multipart/form-data" action="{{ url_for('upload1.index') }}">
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
    <br/>
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
    <img src="{{ file_url }}">
    </body>
    

    参考

    https://zhuanlan.zhihu.com/p/23731819
    https://juejin.im/post/5b3089c151882574e94f0864

    相关文章

      网友评论

          本文标题:FLASK 文件上传 --- 原生实现

          本文链接:https://www.haomeiwen.com/subject/iwkpwftx.html