文件上传

文件上传

一、原生文件上传

(1) 前台模板表单

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h4>文件上传</h4>
<form action="" method="post" enctype="multipart/form-data">
    <p>
        文件上传:<input type="file" name="file">
    </p>
    <p>
        <input type="submit" value="submit">
    </p>
</form>
</body>
</html>
(2) 视图函数处理

代码如下:

from flask import Flask,render_template,request
from flask_script import Manager
import os


app = Flask(__name__)
# 上传文件保存路径
UPLOAD_FOLDER = os.path.join(os.getcwd(),'static/upload')
manager = Manager(app)


@app.route('/form1/',methods=['GET','POSt'])
def upload():
    # 判断请求方式是否为post
    if request.method == 'POST':
        # 获取上传过来的文件对象
        file = request.files.get('file')
        # 获取文件名称
        filename = file.filename
        # 保存上传文件
        file.save(os.path.join(UPLOAD_FOLDER,filename))
        return '上传成功'
    return render_template('form1.html')


if __name__ == '__main__':
    manager.run()

注意:

如果获取不到上传的文件

  1. 表单的提交方式 是否为post
  2. form标签的enctype属性改为multipart/form-data
  3. 上传的字段类型为file 必须存在name属性

二、带限制条件的上传

(1) 模板代码

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h4>文件上传</h4>
{% if filename %}
    <img src="{{ url_for('static',filename='upload/m_'+filename) }}" alt="">
{% endif %}
<form action="" method="post" enctype="multipart/form-data">
    <p>
        文件上传:<input type="file" name="file" required>
    </p>
    <p>
        <input type="submit" value="submit">
    </p>
</form>
</body>
</html>
(2) 视图函数代码

代码如下:

from flask import Flask,render_template,request
from flask_script import Manager
import os
# 安装pillow模块  pip install pillow
from PIL import Image


app = Flask(__name__)
# 允许文件上传的类型
ALLOWED_EXTENSIONS = ['jpg','jpeg','gif','png']
# 文件上传大小
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
# 保存位置
UPLOAD_FOLDER = os.path.join(os.getcwd(),'static/upload')

manager = Manager(app)

"""
添加条件的限制
1.文件类型
2.文件大小
3.保存位置
4.生成唯一的文件名称
5.保存
6.缩放处理
7.前台模板显示
8.上传成功
"""

# 生成唯一图片名称的函数
def random_filename(suffix,length=64):
    import string,random
    Str = string.ascii_letters+string.digits
    return ''.join(random.choice(Str) for i in range(length))+'.'+suffix


# 使用uuid扩展库生成唯一的名称
def random_filename2(suffix):
    import uuid
	u = uuid.uuid4()
	return str(u)+'.'+suffix

@app.route('/form/',methods=['GET','POST'])
def upload():
    new_filename = None
    # 判断请求的方式 和是否有文件传递
    if request.method == 'POST' and request.files.get('file'):
        # 获取上传文件对象
        file = request.files.get('file')
        # 获取名称
        filename = file.filename
        # 获取后缀
        suffix = filename.split('.')[-1]
        # 判断后缀是否允许
        if suffix not in ALLOWED_EXTENSIONS:
            return '该类型不允许上传'
        new_filename = random_filename(suffix)
        # return new_filename
        while True:
            # 拼接文件名称和路径
            path = os.path.join(UPLOAD_FOLDER, new_filename)
            # 判断这个名字的文件是否存在
            if not os.path.exists(path):
                break
        #  保存
        file.save(path)
        # 图片缩放处理
        # 打开文件
        img = Image.open(path)
        # 重新设计尺寸
        img.thumbnail((140,140))
        # 保存缩放后的图片 保留原图片
        # 保存缩放
        img.save(os.path.join(UPLOAD_FOLDER, 'm_'+new_filename))

    return render_template('form1.html',filename=new_filename)


if __name__ == '__main__':
    manager.run()

三、flask-uploads扩展库文件上传

概述:

在文件上传时 提供了很大的方便 如:文件类型的过滤 校验

安装:

pip install flask-uploads

使用:

视图函数代码如下:

from flask import Flask,render_template,request
from flask_script import Manager
# 导入flask-uploads扩展库
from flask_uploads import IMAGES,UploadSet,configure_uploads,patch_request_class
import os

app = Flask(__name__)
# 上传文件大小
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64
# 配置保存的路径
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload')
# 配置过滤类型
photos = UploadSet('photos',IMAGES)
# 和flask对象绑定
configure_uploads(app,photos)
# 配置上传大小的限定按照配置参数app.config['MAX_CONTENT_LENGTH']进行限定
patch_request_class(app,size=None)
manager = Manager(app)


@app.route('/form/',methods=['GET','POST'])
def form():
    img_url = None
    if request.method == 'POST' and request.files.get('file'):
        # 保存文件
        filename = photos.save(request.files.get('file'))
        # 通过上传文件的名称获取路由地址
        img_url = photos.url(filename)
    return render_template('form1.html',img_url=img_url)


if __name__ == '__main__':
    manager.run()

模板代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h4>文件上传</h4>
{% if img_url %}
    <img src="{{ img_url }}" alt="">
{% endif %}
<form action="" method="post" enctype="multipart/form-data">
    <p>
        文件上传:<input type="file" name="file" required>
    </p>
    <p>
        <input type="submit" value="submit">
    </p>
</form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值