Django和Ueditor自定义存储上传文件的文件名


Posted in Python onFebruary 25, 2021

django台后默认上传文件名

在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileField上传文件名默认使用原文件名,当出现同名时会在后面追加下随机数字字母,例如_24ztbZo,但如果上传文件名是中文,到时出现中文的url,则可能出现不可预知的问题,因此将用户上传的文件名重命名。

观察发现命名方式有两种

阿里云建站类似是日期时间+随机数,20210205122908_479.jpg,可自行设置随机数范围,适合小型网站。

import os, datetime, random
filename = "%s_%d"%((datetime.datetime.now().strftime('%Y%m%d%H%M%S')), random.randrange(100, 999))

七牛云对象存储,纯随机数字字母,7a4d72590f1540349a5c9c5dc3c7a00b.jpg,可用uuid实现,绝不重复,可用大型网站

import uuid
filename = uuid.uuid1().hex

models代码实现重命名

定义一个函数,接收两个参数(instance, filename),如形参名,instance为保存模型实例,可获取id等信息,filename就是原始的文件名,可用于获取后缀名。注意使用时不能赋任何实参。

from django.db import models
from extra_apps.DjangoUeditor.models import UEditorField
from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver
import os, datetime, random, uuid

def update_file(instance, filename):
  ext = filename.split('.')[-1] # 获取后缀名
  # filename = "%s.%s"%(uuid.uuid1().hex, ext) # 16进制形式
  filename = "%s_%d.%s"%((datetime.datetime.now().strftime('%Y%m%d%H%M%S')), random.randrange(100, 999), ext)
  return filename


class News(models.Model):
  name = models.CharField(max_length=200, verbose_name="标题")
  front_image = models.ImageField(upload_to=update_file, null=True, blank=True, verbose_name="封面图")

了解基本使用后发现并不能自定义保存路径,可以使用闭包 设置保存路径

from django.db import models
from extra_apps.DjangoUeditor.models import UEditorField
from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver
import os, datetime, random

# 使用闭包设置保存路径
def update_file(path):
  def wrapper(instance, filename):
    ext = filename.split('.')[-1] # 获取后缀名
    filename = "%s_%d.%s"%((datetime.datetime.now().strftime('%Y%m%d%H%M%S')), random.randrange(100, 999), ext)
    return os.path.join(path, filename)
  return wrapper


class News(models.Model):
  name = models.CharField(max_length=200, verbose_name="标题")
  front_image = models.ImageField(upload_to=update_file("news/images/"), null=True, blank=True, verbose_name="封面图")

Ueditor自定义存储上传文件文件名

Django Ueditor是一款非常好的富文本,可心非常方便地插入表格、图片、文件、地图等。

修改Ueditor命名格式

查看源码,原上传文件的命名格式为,

"defaultPathFormat": "%(basename)s_%(datetime)s_%(rnd)s.%(extname)s"

即可,原上传文件名_日期时间_三位随机数,比如上如广州塔.jpg,保存为:广州塔_20210205122908_479.jpg,依旧有中文。

去除上传上文件名中的中文

在源码中找找settings.py,103行去掉%(basename)s_,改为,"defaultPathFormat": "%(datetime)s_%(rnd)s.%(extname)s",目前为20210205122908_479.jpg

# "defaultPathFormat": "%(basename)s_%(datetime)s_%(rnd)s.%(extname)s"
"defaultPathFormat": "%(datetime)s_%(rnd)s.%(extname)s"

避免同名冲突问题

Ueditor是可以多选批量上传的,有机率出现同名冲突问题。在源码中找找views.py,

方法1

增加随机数长度,3位改成6位,上传结果:20210205122908_479.jpg

views,26行,改为"rnd": random.randrange(100000, 999999)

方法2

直接把随机数改为uuid,但会造成新文件名过长,建议去掉日期时间。

views,26行,改为"rnd": uuid.uuid1().hex

settings.py,103行,改为 "defaultPathFormat": "%(rnd)s.%(extname)s",

解除上传文件后缀名大定限制

Ueditor默认只能上传小写的后缀名,这显然是不合理的,

方法1,在settings.py中,将fileAllowFiles这个列表,把所有大写都加上,但这可能很蠢。

"fileAllowFiles": [
    ".png", ".jpg", ".jpeg", ".gif", ".bmp",
    ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
    ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
    ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
    ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
  ],

方法2

views.py,找到162行,在获取后缀名后添加upload_original_ext = upload_original_ext.lower(),将所有后缀名改小写。

# 取得上传的文件的原始名称
upload_original_name, upload_original_ext = os.path.splitext(upload_file_name)
upload_original_ext = upload_original_ext.lower()  # 将后缀名改为小写

到此这篇关于Django和Ueditor自定义存储上传文件的文件名的文章就介绍到这了,更多相关Django和Ueditor存储上传文件名内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
什么是Python中的匿名函数
Jun 02 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
详解python中的闭包
Sep 07 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 Python
Python 图片处理库exifread详解
Feb 25 #Python
python中if嵌套命令实例讲解
Feb 25 #Python
Matplotlib animation模块实现动态图
Feb 25 #Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 #Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 #Python
用pip给python安装matplotlib库的详细教程
Feb 24 #Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 #Python
You might like
PHP树的代码,可以嵌套任意层
2006/10/09 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
vue生命周期的探索
2019/04/03 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python3.8中使用f-strings调试
2019/05/22 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Python和Sublime整合过程图示
2019/12/25 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
团日活动总结模板
2014/06/25 职场文书
群众路线剖析材料
2014/09/30 职场文书
社区国庆节活动总结
2015/03/23 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书