ImageField,FileField上传文件命名问题
2012-03-22 13:49
288 查看
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?
>>> from django.core.files.storage import default_storage
>>> from django.core.files.base import ContentFile
>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
u'/path/to/file'
>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'
>>> default_storage.delete(path)
>>> default_storage.exists(path)
False
其中有from django.core.files.storage import
default_storage
我们查看django的原文件django.core.files.storage
下面定义了Storage和FileSystemStorage,其中FileSystemStorage继承之Storage,文件最后有两句
[python]
view plaincopyprint?
DefaultStorage = get_storage_class(settings.DEFAULT_FILE_STORAGE)
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?
from django.core.files.storage import FileSystemStorage
class ImageStorage(FileSystemStorage):
from django.conf import settings
def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):
#初始化
super(ImageStorage, self).__init__(location, base_url)
#重写 _save方法
def _save(self, name, content):
import os, time, random
#文件扩展名
ext = os.path.splitext(name)[1]
#文件目录
d = os.path.dirname(name)
#定义文件名,年月日时分秒随机数
fn = time.strftime('%Y%m%d%H%M%S')
fn = fn + '_%d' % random.randint(0,100)
#重写合成文件名
name = os.path.join(d, fn + ext)
#调用父类方法
return super(ImageStorage, self)._save(name, content)
OK!其他操作也就是重写相应的方法来满足你的需要喽。
看来,在遇到问题的时候还是要多看看文档,然后看看原程序,看他们是如何实现的,说不定就会有意想不到的想法和发现。
但是默认的存储的文件名是没有改变的,也就是说所存储的文件名就是你上传时文件的本地名,当服务器文件夹下有相同的文件名时,系统会自动添加下划线来改变文件名,以保证文件能顺利上传到服务器上。当是这样的文件名十分不美观,而且很多时候我们喜欢自己定义文件名,甚至动态控制文件保存的位置。这样看上去可能就不那么容易了。其实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?
>>> from django.core.files.storage import default_storage
>>> from django.core.files.base import ContentFile
>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
u'/path/to/file'
>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'
>>> default_storage.delete(path)
>>> default_storage.exists(path)
False
其中有from django.core.files.storage import
default_storage
我们查看django的原文件django.core.files.storage
下面定义了Storage和FileSystemStorage,其中FileSystemStorage继承之Storage,文件最后有两句
[python]
view plaincopyprint?
DefaultStorage = get_storage_class(settings.DEFAULT_FILE_STORAGE)
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?
from django.core.files.storage import FileSystemStorage
class ImageStorage(FileSystemStorage):
from django.conf import settings
def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):
#初始化
super(ImageStorage, self).__init__(location, base_url)
#重写 _save方法
def _save(self, name, content):
import os, time, random
#文件扩展名
ext = os.path.splitext(name)[1]
#文件目录
d = os.path.dirname(name)
#定义文件名,年月日时分秒随机数
fn = time.strftime('%Y%m%d%H%M%S')
fn = fn + '_%d' % random.randint(0,100)
#重写合成文件名
name = os.path.join(d, fn + ext)
#调用父类方法
return super(ImageStorage, self)._save(name, content)
OK!其他操作也就是重写相应的方法来满足你的需要喽。
看来,在遇到问题的时候还是要多看看文档,然后看看原程序,看他们是如何实现的,说不定就会有意想不到的想法和发现。
相关文章推荐
- django ImageField,FileField,上传文件,命名问题
- 关于定制FileField中的上传文件名称问题
- Extjs中用dwr实现文件上传时,fileuploadfield不能正常显示的问题
- struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析
- Spring boot上传文件时MultipartFile为空问题
- [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例
- SpringMVC中MultipartFile参数如果不上传文件报错的问题
- ajaxfileupload上传文件,返回json数据报错的问题。 Resource interpreted as Document but transferred with MIME type ap
- 转:上传文件过大的问题FileUploadBase$SizeLimitExceededException
- 定制FileField中的上传文件名称
- Extjs4中的Form之文件上传filefield
- jQuery 文件上传插件ajaxFileUpload使用以及onchange问题
- spring-boot上传文件MultiPartFile获取不到文件问题解决
- HMTL中文件标签上传文件错误的问题(input type=file)
- yii上传图片、yii上传文件、yii控件activeFileField使用
- 定制FileField中的上传文件名称实例
- Firefox中使用FileReference上传文件的问题:Session丢失
- file解决IE8中文件上传报typeerror拒绝访问问题的解决方法
- FTPClient 上传文件调用storeFile方法SocketException问题
- 上传文件中使用ajaxfileupload.js碰到的问题