Django Download Stream

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Samstag 7. April 2007, 09:19

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 7. April 2007, 10:01

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:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Samstag 7. April 2007, 10:11

Merci, ja momentan geht's um Downloads, aber später kommen noch Uploads hinzu ;)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Samstag 7. April 2007, 18:57

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.
Antworten