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文件比较示例分享
Jan 10 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python实现俄罗斯方块游戏
Mar 25 Python
Python错误处理操作示例
Jul 18 Python
Python对象转换为json的方法步骤
Apr 25 Python
关于Python中定制类的比较运算实例
Dec 19 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
python将unicode和str互相转化的实现
May 11 Python
Python使用scapy模块发包收包
May 07 Python
python井字棋游戏实现人机对战
Apr 28 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
PHP爆绝对路径方法收集整理
2012/09/17 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
写的htc的数据表格
2007/01/20 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
python实现多张图片拼接成大图
2019/01/15 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
医大实习自我鉴定
2013/12/07 职场文书
酒店总经理工作职责
2013/12/13 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
会计工作能力自我评价
2015/03/05 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
大学生党课感想
2015/08/11 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
详解Flask开发技巧之异常处理
2021/06/15 Python
Django框架中表单的用法
2022/06/10 Python