一、需求:

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.自定义存储系统:
暂时没那个必要:只是单纯的修改个文件名而已

三、具体实现:

  1. 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])
  2. 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 自定义存储上传文件的文件名的更多相关文章

  1. Django和Ueditor自定义存储上传文件的文件名

    django台后默认上传文件名 在不使用分布式文件存储系统等第三方文件存储时,django使用默认的后台ImageField和FileField上传文件名默认使用原文件名,当出现同名时会在后面追加下随 ...

  2. django实现分片上传文件

    目标:利用django实现上传文件功能 1,先设置路由系统 urls.py from django.conf.urls import url,include from django.contrib i ...

  3. Django之用户上传文件的参数配置

    Django之用户上传文件的参数配置 models.py文件 class Xxoo(models.Model): title = models.CharField(max_length=128) # ...

  4. element-ui上传组件,通过自定义请求上传文件

    记录使用element-ui上传组件,通过自定义请求上传文件需要注意的地方. <el-upload ref="uploadMutiple" :auto-upload=&quo ...

  5. PHP上传文件出现文件名被截掉第一个字符的问题

    最近用PHP做了一个简单的上传功能,结果出现了一个意想不到的问题.我上传的文件,在获取$_FILES的时候发现文件名的第一个字符被截掉了,因为最开始上传的一直是数字或者字母为名称的文档,也没有太在意这 ...

  6. django + dropzone.js 上传文件

    1.dropzone.js http://www.dropzonejs.com/ dropzone.js是一个可预览\可定制化的文件拖拽上传,实现AJAX异步上传文件的工具 2.dropzone.js ...

  7. 基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度

    借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload&quo ...

  8. Django session cookie 上传文件、详解

    session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...

  9. django Form组件 上传文件

    上传文件 注意:FORM表单提交文件要有一个参数enctype="multipart/form-data" 普通上传: urls: url(r'^f1/',views.f1), u ...

随机推荐

  1. pandas_01

    # Pandas 知识点总结 # Pandas数据结构:Series 和 DataFrame import pandas as pd import numpy as np # 一,Series: # ...

  2. animation关键帧动画语法

    基本声明和用法 @-webkit-keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } @-moz-key ...

  3. SpringBoot中BeanValidation数据校验与优雅处理详解

    目录 本篇要点 后端参数校验的必要性 不使用Validator的参数处理逻辑 Validator框架提供的便利 SpringBoot自动配置ValidationAutoConfiguration Va ...

  4. 极客mysql08

    1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view) 2.事务在启动时会拍一个快照,这个快照是基于整个库的. 基于整个库的意思就是说一个事务内,整个库 ...

  5. kettle连接报错

    如何查看端口号 cmd命令行 输入mysql -u root -p密码进入mysql 输入show global variables like 'port'; 就可以看到端口号3306 测试数据库链接 ...

  6. 怎么用MindManager制作议论文思维导图

    大家都写过作文吧,做小学到高考到大学,这是谁也摆脱不了的,但是大家写作文会提前把自己的思路整理出来吗?让自己行文更为顺畅,作文更为流利吗?特别是关于议论文,一直是高考写作的一个重点篇目,写好议论文,就 ...

  7. 给PDF文件创建书签,实现快速导航

    当文档中的页码比较多的情况下,使用目录进行导航是一个很好用的方法,为文档内容制作目录,方便快速查找目标内容.除了内容的快速导航,书签还能指明不同书签的层级关系,展现文档的结构. 图1:书签的功能 一. ...

  8. Word2 word输入公式+文字转表格

    1.word中输入 =rand() -点击回车键-会随机生成一段文字-可用作排版练习/虚拟的文字排版设计 ##也可以为=rand(2,3)等,括号里可以随即填写其他数字,最后生成文字字数等不一样 2. ...

  9. JUC并发工具包之Semaphore

    目录 Semaphore (JDK) Timed Semaphore (Apache Commons) Semaphore vs. Mutex CodeRepo Semaphore (JDK) 我们使 ...

  10. linux命令模式配置安装mysql

    系统环境: centos 7.1 使用模式:命令模式 使用工具:xshell5 . xftp5 安装mysql前必须删除干净旧的安装包和残留文件,否则安装会失败 查看旧的安装包 rpm -qa | g ...