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编程中的命名空间与作用域
Oct 16 Python
python文件名和文件路径操作实例
Sep 29 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
Django项目中使用JWT的实现代码
Nov 04 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
python两种获取剪贴板内容的方法
Nov 06 Python
python中uuid模块实例浅析
Dec 29 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 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+Html+缓存
2006/12/20 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
jQuery 1.0.2
2006/10/11 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
Python中函数的用法实例教程
2014/09/08 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python定义一个Actor任务
2020/07/29 Python
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
机电工程学生自荐信范文
2013/12/07 职场文书
大学自我鉴定
2013/12/20 职场文书
名人演讲稿范文
2013/12/28 职场文书
2014年情人节活动方案
2014/02/16 职场文书