modifié
Je pense que vous devez extraire path
valeur de FileField objet:
def download_course(request, id):
course = Courses.objects.get(pk = id).course
path = course.path # Get file path
wrapper = FileWrapper(open(path, "r"))
content_type = mimetypes.guess_type(path)[0]
response = HttpResponse(wrapper, content_type = content_type)
response['Content-Length'] = os.path.getsize(path) # not FileField instance
response['Content-Disposition'] = 'attachment; filename=%s/' % \
smart_str(os.path.basename(path)) # same here
return response
Pourquoi est-ce:
Disons que j'ai (bien, j'ai fait) Modèle:
class DanePracodawcy(DaneAdresowe, DaneKontaktowe):
# other fields
logo = ImageWithThumbnailsField(upload_to = 'upload/logos/',
thumbnail = {'size': (180, 90)},
blank = True)
ImageWithThumbnailsField
est sous-classe de FileField, il se comporte de la même manière. Maintenant, quand je le SELECT:
mysql> select logo from accounts_danepracodawcy;
+-----------------------------+
| logo |
+-----------------------------+
| upload/logos/Lighthouse.jpg |
+-----------------------------+
1 row in set (0.00 sec)
il montre (par rapport à MEDIA_ROOT) chemin du fichier stocké. Mais quand j'accéder logo
attribut du modèle:
[D:projekty/pracus]|1> from accounts.models import DanePracodawcy
[D:projekty/pracus]|4> DanePracodawcy.objects.get().logo
<4> <ImageWithThumbnailsFieldFile: upload/logos/Lighthouse.jpg>
[D:projekty/pracus]|5> type(_)
<5> <class 'sorl.thumbnail.fields.ImageWithThumbnailsFieldFile'>
Je reçois par exemple d'un objet. Si je tente de passer à cette instance os.path.getsize
:
[D:projekty/pracus]|8> import os.path
[D:projekty/pracus]|9> os.path.getsize(DanePracodawcy.objects.get().logo)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
D:\projekty\pracus\<ipython console> in <module>()
C:\Python26\lib\genericpath.pyc in getsize(filename)
47 def getsize(filename):
48 """Return the size of a file, reported by os.stat()."""
---> 49 return os.stat(filename).st_size
50
51
TypeError: coercing to Unicode: need string or buffer, ImageWithThumbnailsFieldFile found
Je reçois TypeError, comme vous. J'ai besoin Donc chemin du fichier sous forme de chaîne, qui peut être obtenu avec path
attribut:
[D:projekty/pracus]|13> os.path.getsize( DanePracodawcy.objects.get().logo.path)
<13> 561276L
Sinon, je pourrais obtenir name
attribut et os.path.join
avec réglage MEDIA_ROOT:
[D:projekty/pracus]|11> from django.conf import settings
[D:projekty/pracus]|12> os.path.getsize( os.path.join(settings.MEDIA_ROOT, DanePracodawcy.objects.get().logo.name))
<12> 561276L
Mais c'est à taper inutile.
La dernière chose à noter: parce path
est un chemin absolu, je dois extraire le nom de fichier pour le transmettre à en-tête Content-Disposition:
[D:projekty/pracus]|16> DanePracodawcy.objects.get().logo.path
<16> u'd:\\projekty\\pracus\\site_media\\upload\\logos\\lighthouse.jpg'
[D:projekty/pracus]|17> os.path.basename(DanePracodawcy.objects.get().logo.path)
<17> u'lighthouse.jpg'
nop, le nom du cours est le correspondant du champ 'cours' dans la table – dana
hmm .. c'est tellement bizarre que mon erreur est toujours contrainte à Unicode: besoin de chaîne ou de tampon, FieldFile trouvé. Je ne comprends vraiment pas pourquoi. – dana
Désolé, ma réponse était erronée, j'ai vérifié à nouveau et édité. Maintenant, le code ci-dessus devrait fonctionner comme prévu et j'ai essayé d'expliquer pourquoi cela fonctionne de cette façon. – cji