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 open读写文件实现脚本
Sep 06 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
详解python字节码
Feb 07 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
Python Logging 日志记录入门学习
Jun 02 Python
Django restframework 源码分析之认证详解
Feb 22 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
python通过matplotlib生成复合饼图
Feb 06 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 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爆绝对路径方法收集整理
2012/09/17 PHP
smarty表格换行实例
2014/12/15 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
jquery判断浏览器类型的代码
2012/11/05 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python变量和数据类型详解
2017/02/15 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
Python @property原理解析和用法实例
2020/02/11 Python
Python气泡提示与标签的实现
2020/04/01 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
python 实现图片批量压缩的示例
2020/12/18 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
音乐专业自荐信
2014/02/07 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
解除施工合同协议书
2014/10/17 职场文书
感恩教师主题班会
2015/08/12 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL