ImageField,FileField上传文件命名问题

django 的models.ImageFiled,FileField有属性upload_to,该属性是指定将文件上传到服务器的位置,及存储在哪个文件夹下,你可以很方便甚至很少的代码就可以实现文件上传操作了。

但是默认的存储的文件名是没有改变的,也就是说所存储的文件名就是你上传时文件的本地名,当服务器文件夹下有相同的文件名时,系统会自动添加下划线来改变文件名,以保证文件能顺利上传到服务器上。当是这样的文件名十分不美观,而且很多时候我们喜欢自己定义文件名,甚至动态控制文件保存的位置。这样看上去可能就不那么容易了。其实django也为我们想好了这一点,并且很容易就可以实现你想要的操作。

1. upload_to指定的是文件保存的目录,你可以指定upload_to="/upload/%Y%m",这段的意思是根据当前的年月作为目录名,将文件保存到该文件夹下面,例如,现在是2009年2月,那么文件就会保存在/upload/200902/目录下面。目录可以根据日期来改变了,当然如果我不想用日期呢,而且文件名我如何自定义呢?下面看第二点

2. 查看django文档我们可以看到http://docs.djangoproject.com/en/dev/topics/files/#topics-files,文档中我们发现,下面的代码:

[python] view plaincopyprint?
  1. >>> from django.core.files.storage import default_storage  
  2. >>> from django.core.files.base import ContentFile  
  3.   
  4. >>> path = default_storage.save('/path/to/file', ContentFile('new content'))  
  5. >>> path  
  6. u'/path/to/file'  
  7.   
  8. >>> default_storage.size(path)  
  9. 11  
  10. >>> default_storage.open(path).read()  
  11. 'new content'  
  12.   
  13. >>> default_storage.delete(path)  
  14. >>> default_storage.exists(path)  
  15. False  

其中有from django.core.files.storage import default_storage
我们查看django的原文件django.core.files.storage

下面定义了Storage和FileSystemStorage,其中FileSystemStorage继承之Storage,文件最后有两句

[python] view plaincopyprint?
  1. DefaultStorage = get_storage_class(settings.DEFAULT_FILE_STORAGE)  
  2. default_storage = DefaultStorage()  

与前面from django.core.files.storage import default_storage比较可以发现,

default_storage是我们在settings.py中定义的,也许你在自己项目下面settings.py文件里面没有看到这个属性,但是我们知道项目下面的settings.py都是继承之global_settings.py的,再次查看django原文件,在django/conf可以看到该文件,打开按 Ctrl + F查找DEFAULT_FILE_STORAGE 就可以看到

DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage',

也就是默认的Storage了,找到这个我们就找到文件彻底解决的办法了,写一个自己的Storage,来处理自己需要的操作。

因为Storage是基类,而且是“虚类”,我们可以继承FileSystemStorage,因为该类已经帮我们做好了大部分事情。下面是个简单的例子---实现上面所说的自定义文件名:

 

[python] view plaincopyprint?
  1. from django.core.files.storage import FileSystemStorage  
  2.   
  3.   
  4. class ImageStorage(FileSystemStorage):  
  5.     from django.conf import settings  
  6.       
  7.     def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):  
  8.         #初始化   
  9.         super(ImageStorage, self).__init__(location, base_url)  
  10.   
  11.     #重写 _save方法           
  12.     def _save(self, name, content):  
  13.         import os, time, random  
  14.         #文件扩展名   
  15.         ext = os.path.splitext(name)[1]  
  16.         #文件目录   
  17.         d = os.path.dirname(name)  
  18.         #定义文件名,年月日时分秒随机数   
  19.         fn = time.strftime('%Y%m%d%H%M%S')  
  20.         fn = fn + '_%d' % random.randint(0,100)  
  21.         #重写合成文件名   
  22.         name = os.path.join(d, fn + ext)  
  23.         #调用父类方法   
  24.         return super(ImageStorage, self)._save(name, content)  

OK!其他操作也就是重写相应的方法来满足你的需要喽。

看来,在遇到问题的时候还是要多看看文档,然后看看原程序,看他们是如何实现的,说不定就会有意想不到的想法和发现。

转载于:https://www.cnblogs.com/chenjianhong/archive/2012/03/22/4145148.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring靴子战争包装

Spring Boot建议在构建期间使用嵌入式容器(tomcat或码头)创建一个可执行jar,并在运行时将此可执行jar作为独立进程使用。 但是,通常将应用程序部署到外部容器上是很常见的,Spring Boot提供了打包应用程序的方式&#x…

递归函数

递归函数实在一个函数通过名字调用自身的情况下构成的。 1 window.onload function() {2 var a factorial;3 factorial null;4 alert(a(4));5 };6 7 /**8 * 叠乘9 * param {叠乘的基数} num n 10 * return {叠乘结果} n*(n-1)*(n-2)*...*1 11 */…

正则表达式及测试工具

1. 正则表达式 正则表达式:一种匹配文本中的字符序列的字符模式。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某种模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。 一个正则表达式就是由普通字符&…

CCD与CMOS摄像头的区别

首先说一下在闭路电视监控中摄像机的CCD 和CMOS 的结构,ADC的位置和数量是最大的不同。简单的说,CCD每曝光一次,在快门关闭后进行像素转移处理,将每一行中每一个像素(pixel)的电荷信号依序传入“缓冲器”中…

Java注释教程– ULTIMATE指南(PDF下载)

编者注:在本文中,我们提供了全面的Java注释教程。 Java中的注释是一项主要功能,每个Java开发人员都应该知道如何使用它们。 我们在Java Code Geeks上提供了许多教程,例如创建自己的Java注释 , 带有自定义注释的Java注…

Jquery获取DOM绑定事件

获取到当前正在执行的事件: $(#testDive).bind(click, function(event){alert(event: event.type)}); 获取所有绑定事件: $._data(document.getElementById(testDive), events); 更多专业前端知识,请上 【猿2048】www.mk2048.com

laravel中的自定义函数的加载和第三方扩展库加载

一.自定义公共函数 1. 创建文件 app/Helpers/functions.php 2. 修改项目 composer.json 3.运行composer dump-auto 4.OK,然后你就可以在任何地方用到 app/Helpers/functions.php 中的函数了。 二.添加第三方扩展库 1.确定你要放第三方库的目录,比如还是刚…

Java EE 8发生了什么?

Java EE 8的工作进展顺利。 是时候赶上了! 无需费力就可以潜入… 不要忘记Java EE 7….. 围绕三个重要主题 HTML 5对齐–用于WebSocket的Java API(JSR 356),JSON处理(JSR 353),JAX-RS 2.0&…

HDU 1312 Red and Black

这题就是比较水的一道搜索题了&#xff0c;BFS跟DFS都能做&#xff0c;直接看代码吧&#xff01; AC code&#xff1a; View Code 1 #include <iostream> 2 #define MAX 50 3 using namespace std; 4 int w, h; 5 char map[MAX][MAX]; 6 int dir[][2] {{0, 1}, {1, 0},…

HTML5新增属性学习笔记

1、form属性 表单内的从属元素&#xff0c;可以写在表单外部。可以通过指定元素的form属性来声明元素所属表单。form的属性值为表单的id。 1 <form id"testForm"> 2 <input type"text"> 3 </form> 4 <textarea form"testFo…

Unity3D笔记十七 Unity3D生命周期

一个游戏组件的脚本有一个生命周期——一开始实例化&#xff0c;直到结束实例被销毁。在这期间&#xff0c;他们有时候处于激活状态&#xff0c;有时候处于非激活状态&#xff1b;对于活动&#xff0c;对用户有时候可见&#xff0c;有时候不可见 本文主要讨论常见脚本的的生命周…

自适应堆大小

在改进我们的测试平台以改进Plumbr GC问题检测器的同时 &#xff0c;我最终编写了一个小型测试用例&#xff0c;我认为这对于更广泛的读者来说可能很有趣。 我追求的目标是测试JVM在eden&#xff0c;survivor和Tenured空间之间如何分割堆方面的自适应性。 测试本身正在成批生成…

.Net对SQL数据库的web备份

基于B/S模式下的&#xff0c;数据库远程备份&#xff0c;备份成功后可下载到本地 1 protected void ButtonDataBackup_Click(object sender, EventArgs e) 2 { 3 string newname "数据库名" DateTime.Now.Year.ToString() DateTime.Now.Month.ToStri…

ajax向后台传递数组

$.ajax({traditional: true//这个设置为true&#xff0c;data:{"steps":["qwe","asd","zxc"]}会转换成stepsqwe&stepsasd&... }); 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

错误笔记

1、user_name a and password b时&#xff0c;无法打印到这个节点&#xff0c;原因是 a "yajuan" b 123456时 a 为字符串类型&#xff0c;b为数字类型&#xff0c;类型不同“且”的关系不成立。导致if 节点失败 转载于:https://www.cnblogs.com/wangyajuanjuan…

第一次Java 8体验

像世界其他地方一样&#xff0c;我深深地爱上了Slack。 为什么&#xff1f; 原因很多&#xff0c;但主要的原因是它提供了一种围绕通讯而非工具真正构建SDLC流程的新方法。 您认为这些天哪个更常见&#xff0c;杂乱无章的机智团队在荒野中四处徘徊&#xff0c;尽管他们有出色的…

七个重要习惯——读《高效能人士的七个习惯》整理

个人的成功习惯一&#xff1a;积极主动习惯二&#xff1a;以始为终习惯三&#xff1a;要事第一 公众的成功习惯四&#xff1a;双赢思维习惯五&#xff1a;知彼解己习惯六&#xff1a;综合综效 习惯七&#xff1a;不断更新 附图&#xff1a; 转载于:https://www.cnblogs.com/ziq…

浏览器兼容问题笔记

Safari浏览器&#xff1a; 1.safari执行history.go(-1);需要添加return false; Chrome浏览器 1.Chrome浏览器要预读图片&#xff0c;需要通过对图片的预加载。注&#xff1a;预加载前一定要将<img>加入<body> 1 /* 预加载图片 node-<img> func-回调函数 *…

http://www.tldp.org/LDP/abs/abs-guide.txt.gz

http://www.tldp.org/LDP/abs/abs-guide.txt.gz转载于:https://www.cnblogs.com/itzxy/p/11294815.html

POJ2941 SDUT2371Homogeneous squares

View Code 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 long i,j,n,g,s,t,a[1001],b[1001]; 6 char str[8001];//这里数组开大一点 第一次RT了 数比较大 7 while(scanf("%ld", &n)&&n) 8 { 9 s …