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使用urllib2模块实现断点续传下载的方法
Jun 17 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
python 编程之twisted详解及简单实例
Jan 28 Python
python开发简易版在线音乐播放器
Mar 03 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
python socket网络编程之粘包问题详解
Apr 28 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 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 表单数据的获取代码
2009/03/10 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
介绍一些PHP判断变量的函数
2012/04/24 PHP
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
php笔记之:AOP的应用
2013/04/24 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
Python 远程开关机的方法
2020/11/18 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
2015年法院工作总结范文
2015/04/28 职场文书
python中print格式化输出的问题
2021/04/16 Python