Seite 1 von 1

Django Download Stream

Verfasst: Samstag 7. April 2007, 09:19
von DatenMetzgerX
Hallo Zusammen
Ich habe bei Webfaction ein Hosting Account und es stehen mir max 80MB zur Verfügung.

Ich habe nun eine kleine Platform (Django 0.96), wo dateien getauscht werden und da kommt es oft vor, dass Dateien die grösser als 80MB sind getauscht werden.

Bei meiner Momentanen Download Methode wird aber das ganze file in das response Objekt eingelesen -->> Mehr als 80MB Ram wird verbraucht -->> Prozess wird abgeschossen...

Hier mal mein jetztiger code

Code: Alles auswählen

@login_required
def download(request, id):
    f = getFile(id)
    if f.isDir == True:
        #ToDo: Redirect auf Ordner
        return HttpResponseRedirect("/list/" + str(f.id))
    
    response= HttpResponse(mimetype = f.getMimeType())
    response["Content-Disposition"] = "attachment, filename=" + f.getName()
    response["Content-Type"] = f.getMimeType()
    response["Content-Length"] = str(f.getSize())
    text = f.read()
    while text:
        response.write(text)
        print text
        text = f.read()
        
    f.information.Downloads += 1
    return response
f = getFile(id) ruft mir ein FileObjekt ab, aber sollte in diesem fall ja nicht all zu wichtig sein.

Meine Frage nun, wie kann ich das einlesen und zurückgeben des Files streamen?

Gruess + Dank
DM

Verfasst: Samstag 7. April 2007, 10:01
von jens
Ich kann dir nicht direkt helfen... Aber ich hab gerade was über Upload in django gelesen: Such mal bei http://jesusphreak.infogami.com/blog/vrp1 nach "uploading large files"...
Bugs dazu: vielleicht hat das ja was mit deinem Problem zu tun?

EDIT: Oh, sorry, bei dir geht ja eigentlich um Downloads und nicht um Uploads :oops:

Verfasst: Samstag 7. April 2007, 10:11
von DatenMetzgerX
Merci, ja momentan geht's um Downloads, aber später kommen noch Uploads hinzu ;)

Verfasst: Samstag 7. April 2007, 18:57
von DatenMetzgerX
Soo es gibt eine ganz einfache Lösung...

Code: Alles auswählen

@login_required
def download(request, id):
    f = getFile(id)
    fobj = f.getFileObject()
    if f.isDir == True:
        #ToDo: Redirect auf Ordner
        return HttpResponseRedirect("/list/" + str(f.id))
    
    response= HttpResponse(fobj, mimetype = 'application/octet-stream')
    response["Content-Disposition"] = "attachment, filename=" + f.getName()
    response["Content-Type"] = f.getMimeType()
    response["Content-Length"] = str(f.getSize())
    #text = f.read()
    #while text:
    #    response.write(text)
    #    text = f.read()
        
    f.information.Downloads += 1
    return response
fobj ist eine File Instanz (erstellt mit file(path, 'r')). Django scheint das ganze dann richtig zu handeln.