flask-uploads文件上传

本文详细介绍了使用Flask框架进行文件上传的基本实现与优化过程,包括上传文件的大小限制、类型检查、保存位置设定及展示上传文件的方法。通过引入flask-uploads库,进一步简化并增强了文件上传功能,如生成随机文件名、保存缩略图等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生的文件上传

  • 模板文件

 

<form action="" method="post" enctype="multipart/form-data">

   <input type="file" name="photo">

   <input type="submit" value="上传">

</form>

  • 视图函数

 

@app.route('/upload/',methods=['get','POST'])

def upload():

   if request.method == 'POST':

       # 获取上传对象

       photo = request.files.get('photo')

       if photo:

           # 保存上传文件,参数是文件保存的路径名,如下指定是当前目录

           photo.save(photo.filename)

           return '文件上传成功'

       return '上传失败'

   return render_template('upload.html')

 

  • 优化完善

 

import os

from flask import send_from_directory

# 上传文件保存位置

app.config['UPLOADED_FOLDER'] = os.path.join(os.getcwd(), 'static/upload')

# 请求大小(文件大小限制)

app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8

# 判断是否是允许的文件类型

def allowed_file(filename):

   return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_SUFFIX

   

# 展示上传的文件

@app.route('/uploaded/<filename>')

def upladed(filename):

   # 安全的发送文件

   return send_from_directory(app.config['UPLOADED_FOLDER'], filename)

   

@app.route('/upload/', methods=['GET', 'POST'])

def upload():

   img_url = None

   if request.method == 'POST':

       # 获取上传对象

       photo = request.files.get('photo')

       # 保存前验证文件的类型

       if photo and allowed_file(photo.filename):

           # 拼接文件保存的完整路径名

           pathname = os.path.join(app.config['UPLOADED_FOLDER'],

                                   photo.filename)

           # 保存上传文件,参数是文件保存的路径名

           photo.save(pathname)

           img_url = url_for('upladed', filename=photo.filename)

   return render_template('upload.html', img_url=img_url)

优化:大小限定、类型限定、保存位置、查看上传文件

 

flask-uploads

  • 说明:极大地优化了文件上传的操作,使用非常方便
  • 安装:pip install flask-uploads
  • 使用:
    • 配置

from flask_uploads import UploadSet, IMAGES

from flask_uploads import configure_uploads

from flask_uploads import patch_request_class

import os

app = Flask(__name__)

app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8

app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(), 'static/upload')

# 创建上传对象,指定名字和上传文件的类型

photos = UploadSet('photos', IMAGES)

# 配置上传对象

configure_uploads(app, photos)

# 设置上传文件大小,默认64M,设置为None,大小由MAX_CONTENT_LENGTH决定

patch_request_class(app, size=None)

 

    • 视图函数

@app.route('/upload/', methods=['GET', 'POST'])

def upload():

   img_url = None

   if request.method == 'POST':

       # 获取上传对象

       photo = request.files.get('photo')

       if photo:

           # 保存上传文件

           photos.save(photo)

           # 获取上传文件的地址

           img_url = photos.url(photo.filename)

   return render_template('upload.html', img_url=img_url)

 

    • 优化上传:生成随机文件名

# 生成随机字符串

def random_string(length=32):

   import random

   base_str = 'abcdefghijklmnopqrstuvwxyz1234567890'

   return ''.join(random.choice(base_str) for i in range(length))

@app.route('/upload/', methods=['GET', 'POST'])

def upload():

   img_url = None

   if request.method == 'POST':

       # 获取上传对象

       photo = request.files.get('photo')

       if photo:

           # 提取文件后缀

           suffix = os.path.splitext(photo.filename)[1]

           # 生成随机文件名

           filename = random_string() + suffix

           # 保存上传文件

           photos.save(photo, name=filename)

生成缩略图

# 生成缩略图

from PIL import Image

# 拼接完整路径名

pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'], filename)

# 打开文件

img = Image.open(pathname)

# 设置大小

img.thumbnail((64, 64))

# 保存修改后的图片

img.save(pathname)

           # 获取上传文件的地址

           img_url = photos.url(filename)

   return render_template('upload.html', img_url=img_url)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值