django-如何操作models.FileField資料型別
class ModelFormWithFileField(models.Model):
title = models.CharField(max_length=50)
file = models.FileField(upload_to='test')
def __unicode__(self):
return self.title
比如這是我定義的models類
在資料庫是這麼存的:
+----+-------+-------------------------------------------+
| id | title | file |
+----+-------+-------------------------------------------+
| 1 | 123 | data/detail.docx |
| 2 | 234 | data/model.txt |
| 3 | 456 | test/10月22PS海報.doc |
| 4 | asd | test/56bfb39bgw1ens2t1aeq.jpg |
| 5 | asd | test/38.0.2125.24.manifest |
+----+-------+-------------------------------------------+
進入django環境的shell
這裡匯入models,並選一個id為3名字為10月22PS海報.doc的物件x,其中x.file即為我們題目裡面的models.FileField資料型別
這裡出錯是因為python2.x的bug,當然python3.x沒這個問題,對策如下:
3行程式碼搞定
import File來包裝一下它,包裝過的檔案會自動close,這是官方的一句話和demo
The following approach may be used to close files automatically:
>>> from django.core.files import File # Create a Python file object using open() and the with statement >>> with open('/tmp/hello.world', 'w') as f: ... myfile = File(f) ... myfile.write('Hello World') ... >>> myfile.closed True >>> f.closed True
舉例兩個屬性name和size
當然它的所有屬性可以用dir(myFile)來獲得:
注意,如果要獲得檔案的url,不能包裝它成為File,只能通過
x.file.url獲得
其中的site_media是我在settings.py裡面設定的MEDIA_URL
-----------------------------------------------------------------分割線-----------------------------------------------------------------
下面說一下如何獲得檔案型別來return response
>>> from django.core.servers.basehttp import FileWrapper
>>> import mimetypes
>>> wrapper=FileWrapper(x.file)
>>> content_type=mimetypes.guess_type(x.file.url)
>>> print content_type
('application/msword', None)
>>> x.file.closed
False
>>> myFile.closed
False
>>> x.file.close()
>>> myFile.closed
True
#前提是x.file.url做好對映,讓django能找到檔案,或者我推測它只是通過後綴來確定
在views.py中:
update_to, filename = str(x.file).split('/')
response=HttpResponse(wrapper,mimetype='content_type')
response['Content-Length'] = x.file.size
response['Content-Disposition']="attachment;filename=%s" % filename
return response
搞定