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 ...
随机推荐
- lambda表达式的distinct去重
天真的我最开始以为可以写成list.distinct(x=>x.name);以为这样就可以按照name去重了,结果是不行的.这里记录下正确的用法. 1.这里是针对int集合 可以满足 #reg ...
- Qt基础之菜单栏
本篇介绍Qt菜单栏相关操作,分为三部分:1.菜单栏相关的类介绍:2.系统菜单的生成和响应:3.弹出菜单的生成和响应:菜单栏通常只有以QMainWindow为基类的程序中才用到,以QWidget为基类的 ...
- Git Push大文件报错后如何撤回
昨晚在提交一个项目代码时,不小心把数据库备份文件也一起Commit了:到最后Push的时候报错了.最后弄了半天解决了,在此记录下. 如下图,文件有108M. 项目放在第三方托管平台上,根据提示查看了原 ...
- Python学习笔记1:基础
1.编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 你也可以为源文件指定不同的字符编码.在 #! 行(首行)后插入至少一行特殊的注释行来定义 ...
- powershell渗透-信息收集命令
powershell渗透-信息收集命令 本文包含从 Internet 的各个角落收集的 PowerShell 命令列表,这些命令在渗透测试或红色团队练习期间可能会有所帮助. 该列表包括各种开发后的单行 ...
- lseek系统调用
文件的随机读写.目前为止,文件都是顺序访问.读写都是从当前文件的偏移位置开始,然后文件偏移值自动的增加到刚好超出读或者写结束的位置是它为下一次作好准备.在linux中有文件偏移.使得随机访问变得简单, ...
- 《.NET 5.0 背锅案》第7集-大结局:捉拿真凶 StackExchange.Redis.Extensions 归案
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- PL/SQL Developer 13注册码(亲测可用)
product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number: 226959 password: xs374ca
- CTF练习(1)这是一张单纯的图片?
1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个 CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便 ...
- day02-多任务(进程和协程)
一.多任务的概念 简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务 ...