日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ImageField,FileField上传文件命名问题

發布時間:2023/12/2 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?
  • >>>?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!其他操作也就是重寫相應的方法來滿足你的需要嘍。

    看來,在遇到問題的時候還是要多看看文檔,然后看看原程序,看他們是如何實現的,說不定就會有意想不到的想法和發現。

    轉載于:https://www.cnblogs.com/chenjianhong/archive/2012/03/22/4145148.html

    總結

    以上是生活随笔為你收集整理的ImageField,FileField上传文件命名问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。