django 自定义存储上传文件的文件名
一、需求:
Django实现自定义文件名存储文件
使文件名看起来统一
避免收到中文文件导致传输、存储等问题
相同的文件也需要使用不同的文件名
二、实现思路:
思路:
生成14位随机字母加数字、后10位采用时间戳。从而实现相同文件不同文件名
1.view版:
在view接收到文件名之后进行重命名,不修改Django默认的文件存储逻辑。从而实现需求
2.upload_to版
参考链接:https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.FileField.upload_to
官方原文:
upload_to may also be a callable, such as a function. This will be called to obtain the upload path, including the filename.
upload_to也可以是可调用的,例如函数。这将被调用以获得上载路径,包括文件名。
3.自定义存储系统:
暂时没那个必要:只是单纯的修改个文件名而已
三、具体实现:
views版:
涉及views.py 、utils.py(自定义)
views.py:
class UploadIdentImageView(APIView):
def get(self, request, *args, **kwargs):
return Response({"msg":"ident", "status_code": True}) def post(self, request, *args, **kwargs):
# from somewhere import handle_uploaded_file
file_name = request.FILES.get("file", None)
if not file_name:
return Response({"msg": "ident", "status_code": False}) from test_app.utils import custom_file_name
file_name.name = custom_file_name(file_name) models_object = models.IdCardImage(image_path=file_name)
models_object.save()
print(models_object)
return Response({"msg":"ident", "status_code": True})
test_app\utils.py
def random_str():
import random
import time num_set = [chr(i) for i in range(48, 58)]
char_set = [chr(i) for i in range(97, 123)]
total_set = num_set + char_set
bits = 14
value_set = "".join(random.sample(total_set, bits))
return value_set + str(int(time.time())) def custom_file_name(file_name):
file_type = str(file_name).split(".")[-1]
new_file_name = random_str().upper() return ".".join([new_file_name,file_type])
upload_to版:
涉及models.py。test_app\utils.py沿用上面内容
models.py
def user_directory_path(upload_to):
def wrapper(instance, filename):
import datetime
import os
from mini_programe.utils import custom_file_name filename = custom_file_name(filename) dirname = datetime.datetime.now().strftime(upload_to)
new_upload_to = os.path.join(dirname,filename)
return new_upload_to
return wrapper class IdCardImage(models.Model):
f_id = models.ForeignKey(Users, on_delete=models.SET_NULL,null=True,verbose_name="用户",related_name="user_id_card_img")
# image_path = models.FileField(upload_to='media/id_card_img/%Y/%m/')
image_path = models.FileField(upload_to=user_directory_path('media/id_card_img/%Y/%m/'))
四、最终效果:
- 图片:

五、效果对比:
个人更倾向于方案二,理由是:views.py文件中的处理函数的处理逻辑应该看起来简单一些。采用方案二整理后的view.py看起来像这样:
class UploadIdentImageView(APIView):
def get(self, request, *args, **kwargs):
return Response({"msg":"ident", "status_code": True})
def post(self, request, *args, **kwargs):
file_name = request.FILES.get("file", None)
if not file_name:
return Response({"msg": "ident", "status_code": False})
models_object = models.IdCardImage(image_path=file_name)
models_object.save()
return Response({"msg":"ident", "status_code": True})
生成随机字母加数字的逻辑参考链接:https://blog.csdn.net/u010039418/article/details/86013620
django 自定义存储上传文件的文件名的更多相关文章
- Django和Ueditor自定义存储上传文件的文件名
django台后默认上传文件名 在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileField上传文件名默认使用原文件名,当出现同名时会在后面追加下随 ...
- django实现分片上传文件
目标:利用django实现上传文件功能 1,先设置路由系统 urls.py from django.conf.urls import url,include from django.contrib i ...
- Django之用户上传文件的参数配置
Django之用户上传文件的参数配置 models.py文件 class Xxoo(models.Model): title = models.CharField(max_length=128) # ...
- element-ui上传组件,通过自定义请求上传文件
记录使用element-ui上传组件,通过自定义请求上传文件需要注意的地方. <el-upload ref="uploadMutiple" :auto-upload=&quo ...
- PHP上传文件出现文件名被截掉第一个字符的问题
最近用PHP做了一个简单的上传功能,结果出现了一个意想不到的问题.我上传的文件,在获取$_FILES的时候发现文件名的第一个字符被截掉了,因为最开始上传的一直是数字或者字母为名称的文档,也没有太在意这 ...
- django + dropzone.js 上传文件
1.dropzone.js http://www.dropzonejs.com/ dropzone.js是一个可预览\可定制化的文件拖拽上传,实现AJAX异步上传文件的工具 2.dropzone.js ...
- 基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度
借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload&quo ...
- Django session cookie 上传文件、详解
session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...
- django Form组件 上传文件
上传文件 注意:FORM表单提交文件要有一个参数enctype="multipart/form-data" 普通上传: urls: url(r'^f1/',views.f1), u ...
随机推荐
- pandas_01
# Pandas 知识点总结 # Pandas数据结构:Series 和 DataFrame import pandas as pd import numpy as np # 一,Series: # ...
- animation关键帧动画语法
基本声明和用法 @-webkit-keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } @-moz-key ...
- SpringBoot中BeanValidation数据校验与优雅处理详解
目录 本篇要点 后端参数校验的必要性 不使用Validator的参数处理逻辑 Validator框架提供的便利 SpringBoot自动配置ValidationAutoConfiguration Va ...
- 极客mysql08
1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view) 2.事务在启动时会拍一个快照,这个快照是基于整个库的. 基于整个库的意思就是说一个事务内,整个库 ...
- kettle连接报错
如何查看端口号 cmd命令行 输入mysql -u root -p密码进入mysql 输入show global variables like 'port'; 就可以看到端口号3306 测试数据库链接 ...
- 怎么用MindManager制作议论文思维导图
大家都写过作文吧,做小学到高考到大学,这是谁也摆脱不了的,但是大家写作文会提前把自己的思路整理出来吗?让自己行文更为顺畅,作文更为流利吗?特别是关于议论文,一直是高考写作的一个重点篇目,写好议论文,就 ...
- 给PDF文件创建书签,实现快速导航
当文档中的页码比较多的情况下,使用目录进行导航是一个很好用的方法,为文档内容制作目录,方便快速查找目标内容.除了内容的快速导航,书签还能指明不同书签的层级关系,展现文档的结构. 图1:书签的功能 一. ...
- Word2 word输入公式+文字转表格
1.word中输入 =rand() -点击回车键-会随机生成一段文字-可用作排版练习/虚拟的文字排版设计 ##也可以为=rand(2,3)等,括号里可以随即填写其他数字,最后生成文字字数等不一样 2. ...
- JUC并发工具包之Semaphore
目录 Semaphore (JDK) Timed Semaphore (Apache Commons) Semaphore vs. Mutex CodeRepo Semaphore (JDK) 我们使 ...
- linux命令模式配置安装mysql
系统环境: centos 7.1 使用模式:命令模式 使用工具:xshell5 . xftp5 安装mysql前必须删除干净旧的安装包和残留文件,否则安装会失败 查看旧的安装包 rpm -qa | g ...