Project

General

Profile

Support #18499

Updated by Carsten Rose about 1 month ago

h2. a) guarantee unique filename 

 * Beim Upload ist es oft noetig das QFQ die Files 'unique' ablegt. 
 * Beispiel: Ein User soll drei unterschiedliche Dokumente hochladen und er benennt alle gleich. Damit muss QFQ klar kommen. 
 * Wunsch: optional waere es gut wenn aus dem Dateinamen keine Rueckschluesse auf den Upload User geschlossen werden koennen. 

 h2. b) on download, offer orig filename. 

 * Wenn ein User ein Dokument hochlaedt und dann zum Test wieder herunter, erwartet er, das der Dateiname gleich bleibt. 
 * Das ist aktuell bei der @fileDestination = fileadmin/{{id:R}}_{filename:Y}} nicht der Fall. 

 h2. Ziel 

 * Option: QFQ Developer soll sich nicht darum kuemmern das der finale Dateiname unique ist, das soll QFQ selbst machen. 
 * Option: QFQ Developer soll die Moeglichkeit haben den finalen Dateinamen vorzugeben. 

 h2. Vorschlag 

 Feature: uniqueness und orig filename zusammen. 

 <pre> 
 fileDestination = fileadmin/[prefix]{{filenameUnique:V}} 
 </pre> 

 * @[prefix]@ Kann, muss aber nicht, angegeben werden. 
 * Wenn es angegeben wird, und kein '_' am Ende vorhanden ist, wird ein '_' als Trennzeichen eingesetzt. 
 * Enthaelt @[prefix]@ selbst '_', macht das nichts, es wird von rechts nach '_' gesucht. 
 * @{{filenameUnique:V}}@  

   * Wie ueblich wird ist der Dateiname 'gesanatized' - damit darueber keine Angriffe moeglich sind. 
   * Der @{{filenameUnique:V}}@ zurueckgelieferte Wert ist Original Dateiname, Base64 kodiert. Basis ist @{{filename:V}}@. 
   * Laut https://en.wikipedia.org/wiki/Base64 kann das Zeichen kodiert (ohne extension), '/' vorkommen. Das waere im Filesystem schlecht. Beim fertig kodierten String wird daher '/' sind durch '-' ersetzt. 
   * unique: QFQ ersetzt, erweitert das er unique ist (QFQ fuegt einen Index ein falls bereits eine Datei gleichen Namens existiert (s.u.). 
   existiert). Bsp: 
 <pre> 
 # Dateiname: 'hello.pdf' 
 echo "hello" | base64 | tr '/' '-' 
 aGVsbG8K 
 </pre> 
 * Dateinamen, die dazu fuehren das der BASE64 String laenger als eine Zeile ist, werden solange von hinten gekuerzt, gekuerzt    bis der BASE64 Code code in eine Zeile passt. 

 Bsp: 
 <pre> 
 # Dateiname: 'hello.pdf' 
 echo "hello.pdf" | base64 | tr '/' '-' 
 aGVsbG8ucGRmCg== 
 </pre> 

 * Finale Datei: @fileadmin/[prefix]_B64_aGVsbG8ucGRmCg==.pdf@ @fileadmin/[prefix]_B64aGVsbG8K.pdf@ 
 * Obwohl die Extension in dem Base64 kodierten String enthalten ist, Aus @{{filenameUnique:V}}@ wird sie trotzdem nochmal angehaengt - damit es keine Probleme bei der Erkennung des Dateitypens geben, sollte z.B. nativ via HTML auf die Datei zugegriffen werden. @B64aGVsbG8K.pdf@, und @aGVsbG8K@ entspricht 'hello'. 
 * uniqueness: Falls es die Datei bereits gibt, gibt: @1_B64aGVsbG8K.pdf@. 1 wird in @_B64_@ vor dem zweiten '_' ein Index eingefuegt.  

   hochgezaehlt fuer weitere Duplikate. 
 * Bsp: [prefix]_B64_aGVsbG8ucGRmCg==.pdf, [prefix]_B641_aGVsbG8ucGRmCg==.pdf, [prefix]_B642_aGVsbG8ucGRmCg==.pdf 

 * Wird kein {{filenameUnique:V}} verwendet, ist das uniqness Feature implizit deaktiviert. 

 h2. Hinweis 

 
 * Wurde eine Datei 'a' schon mal hochgeladen, wird sie geloescht und eine andere Datei 'b' hochgeladen, so wird    'a' zuerst durch QFQ geloescht und dann 'b' eingetragen - das muss getestet werden ob es noch gut funktioniert. 

 h2. Download 

 Fuer den Download: 

   * Findet der Download via einem direktem HTML @<a href="fileadmin/...">@ statt, kann *kein* kein @save-as@ filename gesetzt werden. Der User speichert dann den Base64 BASE64 kodierten Dateinamen.  

 Download via download.php, mit oder ohne SIP Kodierung: 

  
   * Ist in der @..AS _excel|pdf|link'    kein explizites @d:<save-as>|...@ definiert gesetzt und gibt es @_B64._@ @_B64@ im Dateinamen, wird automatisch @<save-as>@ gesetzt (von hinten im Dateinamen nach '_B64...<.ext>' suchen und dekodieren). 
 * Bei zusammengesetzen Dateien (PDF, ZIP) sollte es keine Aenderung geben, die sind nicht durch dieses Ticket betroffen. 

 h2. Summary 

 * Der Vorschlag ist 100% Rueckwaertskompatibel, nur wenn @{{filenameUnique:V}}@ verwendet wird, findet eine Kodierung das Dateinamens statt. 
 * Automatische Uniqueness ist nur moeglich inkl. automatischer Base64 Kodierung. 

Back