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中的元祖(Tuple)和字典(Dict)
Apr 21 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
对python模块中多个类的用法详解
Jan 10 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
在pycharm中配置Anaconda以及pip源配置详解
Sep 09 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
Python提取PDF指定内容并生成新文件
Jun 09 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高自定义性安全验证码代码
2011/11/27 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
印尼旅游网站:via
2017/11/12 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
实习推荐信
2014/05/10 职场文书
班级读书活动总结
2014/06/30 职场文书
企业消防安全责任书
2014/07/23 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
晚会开幕词范文
2016/03/04 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Python基本数据类型之字符串str
2021/07/21 Python
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android