django-die Rückkehr-Datei über die HttpResponse - Datei ist nicht ordnungsgemäß zugestellt
Möchte ich wieder einige Dateien in eine HttpResponse-und ich bin mit der folgenden Funktion. Die Datei, die zurückgegeben wird, hat immer eine Dateigrösse von 1kb und ich weiß nicht, warum. Ich kann die Datei öffnen, aber es scheint, dass es nicht ordnungsgemäß zugestellt. Daher wollte ich wissen, wie kann man return-Dateien mit django/python über eine HttpResponse.
@login_required
def serve_upload_files(request, file_url):
import os.path
import mimetypes
mimetypes.init()
try:
file_path = settings.UPLOAD_LOCATION + '/' + file_url
fsock = open(file_path,"r")
#file = fsock.read()
#fsock = open(file_path,"r").read()
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
print "file size is: " + str(file_size)
mime_type_guess = mimetypes.guess_type(file_name)
if mime_type_guess is not None:
response = HttpResponse(fsock, mimetype=mime_type_guess[0])
response['Content-Disposition'] = 'attachment; filename=' + file_name
except IOError:
response = HttpResponseNotFound()
return response
Bearbeiten:
Der bug ist eigentlich kein bug 😉
Diese Lösung ist in der Produktion auf einem apache-server, damit die Quelle ist ok.
Beim schreiben dieser Frage getestet habe ich es mit der lokalen django development server und Frage mich, warum es nicht funktioniert. Ein Freund von mir erzählte mir, dass dieses Problem könnte entstehen, wenn die mime-Typen sind nicht in den server. Aber er war nicht sicher, ob dies das problem ist. Aber eine Sache ist sicher.. es hat etwas zu tun mit dem server.
InformationsquelleAutor der Frage Thomas Kremmel | 2010-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Weitergabe der
fsock
iterator als parameter anHttpResponse()
anstatt seinewrite()
Methode, die ich denke, dass erwartet einen string.Sehen http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators
Auch, ich bin mir nicht sicher, die Sie anrufen möchten
close
auf Ihre Datei vor der Rückkehrresponse
. Gespielt zu haben, um mit diesem in der shell (ich habe nicht versucht, das in einem wirklichen Django-Ansicht), es scheint, dass dieresponse
nicht auf die Datei zugreifen, bis dieresponse
selbst Lesen. Versuch zum Lesen eineHttpResponse
erstellt eine Datei, die ist jetzt abgeschlossen, die Ergebnisse in einemValueError: I/O operation on closed file
.So, möchten Sie vielleicht lassen Sie
fsock
öffnen, und lassen Sie den garbage collector deal mit ihm nach der Antwort gelesen.InformationsquelleAutor der Antwort Ben James
Könnte es sein, dass die Datei enthält auch einige nicht-ascii-Zeichen, render ok, in der Produktion aber nicht bei der Entwicklung?
Versuchen Sie das Lesen der Datei als binary:
InformationsquelleAutor der Antwort alves
Versuchen die Deaktivierung von "django.middleware.gzip.GZipMiddleware" von Ihrem MIDDLEWARE_CLASSES in settings.py
Ich hatte das gleiche problem, und nachdem ich sah, um die middleware-Ordner, dieser middleware schien sich schuldig zu mir, und entfernen Sie Tat den trick für mich.
InformationsquelleAutor der Antwort Anonymous