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 相关文章推荐
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
Python将图片转换为字符画的方法
Jun 16 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
Php多进程实现代码
May 07 Python
python matlibplot绘制多条曲线图
Feb 19 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
Python 中如何写注释
Aug 28 Python
python使用ctypes库调用DLL动态链接库
Oct 22 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
Django如何将URL映射到视图
2019/07/29 Python
python可视化实现KNN算法
2019/10/16 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
详解python中的闭包
2020/09/07 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
小学优秀班干部事迹材料
2014/05/25 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书