Django: File upload uuid4 aber Download mit lesbarem Dateinamen

Django, Flask, Bottle, WSGI, CGI…
Antworten
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

Hallo.

Ich habe eine Upload Funktion für Profilfotos, Dateien, etc...
Beim Upload gebe ich diesen per Model-Funktion (uuid4) einen uniquen Dateinamen. Das funktioniert auch Alles einwandfrei.
Wenn ich nun allerdings die Datei downloade, dann habe ich diesen sehr unaussagekräftigen Namen im Download Ordner.

Gibt es eine Möglichkeit den Namen für den Download zu änder?
Mein Upload Model besteht aus den Feldern (description (z.b. Screenshot_15_08) , article (ForeignKey) und dem FileField

Im Optimalfall hat die Datei beim Download den namen description.XXX

Gibt es da einen einfachen Weg dies zu realisieren?

Danke schonmal im Voraus!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@SnakeBite: Der Dateiname ergibt sich ja aus der URL. Normalerweise hat man daher URLs der Form: http://server/uploads/[uuid]/[description].jpg
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

Ja, das ist korrekt. Aber es gibt zweierlei Gründe warum ich dies gerne wie oben beschrieben machen würde.

1. Dem User ist für eine korrekte Bezeichnung der Dateinamen nicht zu vertrauen.
2. Ich will mehrere Dateien in einem Ordner. Daher würde ich gerne randomisierte Dateinamen verwenden.

Kennt denn jemand einen Weg dafür?

In den Docs gibt es ein ähnliches Beispiel, allerdings nur für eine Datei.
https://docs.djangoproject.com/en/dev/h ... tting-pdf/

Code: Alles auswählen

def some_view(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'
    ...
    return response
Ich hätte aber lieber eine Model-Funktion, da ich auf einer Seite mehrere solcher Datei-Downloads anbieten möchte.
BlackJack

@SnakeBite: Ad 1. Wo soll denn der Dateiname herkommen? Und ob Du das in der URL oder über den HTTP-Header machst, ist doch letztlich egal.

Ad 2. Der Name der Datei auf dem Server und der ”Name” in der URL oder im HTTP-Header sind doch unabhängig voneinander, darum verstehe ich den Punkt 2 nicht.
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

BlackJack hat geschrieben: Ad 2. Der Name der Datei auf dem Server und der ”Name” in der URL oder im HTTP-Header sind doch unabhängig voneinander, darum verstehe ich den Punkt 2 nicht.
Könntest Du das bitte erkläutern? Das verstehe ich nicht.

Beispiel:

1. Ich habe eine Datei namens "frankfurt.pdf"
2. Diese lade ich auf meiner website hoch zu "/files/frankfurt.pdf".
3. Dann füge ich den Link dazu auf meiner Website ein, damit man die Datei herunterladen kann.
4. User lädt die Datei "frankfurt.pdf" herunter. Auf seinem PC heisst diese auch "frankfurt.pdf"

Was ich aber will:

1. Ich habe eine Datei namens "frankfurt.pdf"
2. Diese lade ich auf meiner website hoch zu "/files/jpo8jffi8werof89f8orfhworifj9348fhqfiejhfoiwef.pdf" mit der model.description = "Stadtführung für Frankfurt"
3. Dann füge ich den Link dazu auf meiner Website ein, damit man die Datei herunterladen kann.
4. User lädt die Datei "jpo8jffi8werof89f8orfhworifj9348fhqfiejhfoiwef.pdf" herunter. Auf seinem PC heisst diese jedoch "Stadtführung durch Frankfurt.pdf"

Ich bräuchte also irgendwo in dem Prozess die Möglichkeit zu sagen:

Neuer Filename = file.description + oldfile.extension (Das hier ist natürlich kein Python code, es geht lediglich um die Logik dahinter)

Ich habe leider keine Ahnung was das mit einem HTTP Header zu tun hat. Ich bin ein Noob. :-(
BlackJack

@SnakeBite: Dann musst Du für die Webseite entweder einen Link generieren wo als letztes ”file.description + oldfile.extension” steht, wie von Sirius3 vorgeschlagen, oder Du musst halt wie Du das ja selber gezeigt hast, den Content-Disposition HTTP-Header entsprechend setzen.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich hätte aber lieber eine Model-Funktion, da ich auf einer Seite mehrere solcher Datei-Downloads anbieten möchte.
Aber selbst, wenn du eine Seite mit X Download-Links hast, kannst der Nutzer der Seite doch immer nur _eine_ Datei auf einmal runter laden. D.h. du kannst grundsätzlich auch die Content-Disposition machen.

Das von dir gezeigt Beispiel hat übrigens keine wirklichen Bezug zu deinem Problem, da dort eine PDF-Datei "on the fly" via ReportLab generiert und dann von Django ausgeliefert wird. Du lieferst ja statischen Content.

Gruß, noisefloor
Antworten