ratzekahl1
Goto Top

Multiple File Upload

Hallo zusammen,
ich möchte in einem Formular ua ein Multiple File Upload implementieren.

...
<h2 class='ueberschrift'>Neuer Vorgang</h2><div class="kundenadressblock"><br/><br/>Herr  Walter Muster<br/>Hermann-L&ouml;ns-Stra&szlige 17<br/>48123 München<br/><br/></div><form method="POST" action="vorgangspeichern.php" name="haupt_form" enctype="multipart/form-data">  
      <center><table class="datentabelle" cellspacing="0">  
	<tr><td class='datenzelle2'>Kurzbeschreibung</td>  
	<td class='datenzelle2'><input type='text' name='kurzbeschreibung' size='57' value='' ></td></tr>  
	<tr>
	<td class='datenzelle2'>Datum</td>  
	<td class='datenzelle2'><input type='text' name='datum' size='57' value='17.04.2023 - 16:46' readonly></td>  
	</tr>
	<tr><td class='datenzelle2'>Gesprochen mit</td><td class='datenzelle2'><input type='text' name='gesprochenmit' size='57' value='Walter Muster'></td></tr>  
	  <tr><td class='datenzelle2'>Kontakt </td><td class='datenzelle2'><select name="kontaktart_id"><option value='1'>Telefon</option><option value='2'>E-Mail</option><option value='3'>persönlich</option><option value='4'>ViKo</option><option value='5'>Post</option></select></td></tr>  
      
     <tr><td class="datenzelle2">Beschreibung</td><td class="datenzelle2">  
	<textarea name="beschreibung" cols="10" rows="5"></textarea></td></tr>  
	 <tr><td class="datenzelle2">Medien</td><td class="datenzelle2">  
	 <input type="file" name="unterlagen[]" multiple accept=".jpg,.png,.pdf">  
	 <!-- <input type="file" name="datei" accept="application/pdf"> --> 
  <tr><td >&nbsp;</td><td><input type="hidden" name="id" value="44"><input type="submit" value="OK" name="dokuerstellen"></form>...  

Dann speichern bzw. upload:
$uploaddir = 'C:\\xampp\\htdocs\\app\\Dokumente\\medien\\';  
 //$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files. 

// Count # of uploaded files in array
$total = count($_FILES['unterlagen']['name']);  

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['unterlagen']['tmp_name'][$i];  

  //Make sure we have a file path
  if ($tmpFilePath != ""){  
    //Setup our new file path
    $newFilePath = "C:\\xampp\\htdocs\\app\\Dokumente\\medien\\" . $_FILES['unterlagen']['name'][$i];  

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

Das funktioniert soweit. Nun habe ich zwei Fragen:
Gibt es eine best practise für einen Datenbankeintrag?

Tabelle
id | column A | column B |column C | ...
1 | blah | world |space | ...
2 | blah2 | world2 |space2 | ...
...
Nun neuer Eintrag. Also normalerweise id3. Dannmöhte ich diesem Eintrag bis zu 5 Bilder zuordnern. Meide Idee:
pics3_1.jpg, pics3_2.jpg, pics3_3.jpg, pics3_4.jpg, pics3_5.jpg.
Damit weiß ich zwischen "pics" und "_" ist die id des zugehörigen Eintrags.

Gibt es da einen besseren Weg? Wie stelle ich sicher, dass es wirklich id3 wird und was ist beim löschen von Eintrag mit der id3? Dann m+üsste ich j alles löschen was mit pics3_ anfängt?

Die nächste Frage ist, wie schütze ich die datei vorm direkten download? Nach dem Muster könnte jeder die Datei aufrufen, hätte den Pfad und könnte durchprobieren: pics1_1.jpg, pics2_1.jpg, pics123_1.jpg.

Wie ist das mit htaccess ? Schütze ich damit rekursiv, inkl Unterverzeichnisse oder muss ich mir irgendwas basteln ?

Also was weiß ich ne php Datei die nur header("Location:\pfad\zurDateien") weiterleitet und da zB ne Slideshow aufmacht. Aber das lösst mein Problem och auch nicht wirklich.

Any idea
Ratzekahl

For testing, I am using xampp, so I cannot post a link.

Content-ID: 6810490534

Url: https://administrator.de/contentid/6810490534

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

StefanKittel
StefanKittel 17.04.2023 um 18:23:04 Uhr
Goto Top
Hallo,

nutze doch die SessionID + einen Zähler in der Session

Stefan
maretz
maretz 17.04.2023 um 20:41:27 Uhr
Goto Top
nun - ehrlich gesagt ist das was du da schreibst ein wenig "verwirrend" geschrieben.

Im generellen würde ich jedoch das ganze etwas anders angehen. Denn auf den Dateinamen würde ich mich nicht verlassen wollen - was passiert denn zB. wenn ich die datei pic3_3.jpg selbst hochlade weil die bei mir einfach so heisst?

Ich würde die ID und den Dateinamen ggf. eher als MD5-Summe der hochgeladenen Datei machen. Wenn jemand dieselbe Datei dann 2x hochlädt wäre die MD5 gleich und es würde eben nicht gehen (den Fehler müsstest du natürlich sauber abfangen oder nen Update machen wenn zB. eben dieselbe Datei hochgeladen wurde aber nen Update der Beschreibung erfolgt).

Du kannst da noch einiges mehr machen (z.B. eine art UUID bilden - aus der MD5 und ner Checksum aus der Beschreibung),... Aber einfach nur ne hochzählende ID erlaubt es halt auch recht leicht die Dateinamen zu erraten. Dann müsstest du noch einiges zum Schutz unternehmen.
ratzekahl1
ratzekahl1 18.04.2023 um 09:23:05 Uhr
Goto Top
Guten Morgen,
@StefanKittel Wofür die Sessionid?
@maretz Was ist unklar?

Vielleicht nochmal ganz grob: Ich habe einen Vorgang mit der id 12 Zu dem Vorgang möchte ich Bilder zuordnen.
Simples Beispiel: Urlaub:
id 12, 2022 , Urlaub Malle, Bild 1-5 Also 5 Bilder zB img123, img 224, img543, ... So kommen die von der Kamera
id13, 2021, Urlaub Allgäu, Bild 1-27 27 Bilder vom Handy dicm12,dicm234, ...
id 14, 2020, Urlaub Sauerland, keine Bilder
Und irgendwie muss ich die Bilder mit dem Urlaub Malle verknüpfen. In der Tabelle möchte ich dann einen Link zu einer Gallerie haben.
Ich hoffe es ist nun klarer.

Bei allen möglichen websites habe ich unter Downloads niemals mehr einen direkten link auf die Datei. Sondern es scheint, als wenn es durchgeschleift wird. Also ein Link zu einer download.php oä
mfG
StefanKittel
StefanKittel 18.04.2023 aktualisiert um 09:45:07 Uhr
Goto Top
Zu jeder Verbindung eines Clients kann man eine eindeutige ID generieren.
https://de.ryte.com/wiki/Session-ID
ratzekahl1
ratzekahl1 18.04.2023 um 10:51:01 Uhr
Goto Top
@StefanKittel Das mit der Session ID wusste ich. Damit identifiziert man User. Soweit klar. Aber was hilft mir das bei meinem Vorhaben? Ich will die Bilder nicht dem User zuordnen, sondern einem Eintrag.

Also Eintrag mit der id 1234 Dazu wählt man Bild 1, Bild, Bild 3 und lädt die hoch. Dann möchte ich die Bilder dem Eintrag mit der id 123 zuordnen. Also Tabelle mit vorgang_id, id, Bildname(n).

Theoretisch kann man die Bilder ja umbenennen: Nordseekueste2021_01.jpg, Nordseekueste2021_02.jpg usw.
Aber das ist doch Quark.

Wenn ich aus dem Pfad ein md5 rausmache. Dann via implode einen String generiere und diesen in die DB schreibe, die Dateien entsprechend umbenenne., wüsste ich zB dass Bild: sdedf23453t2t2ttt2.jj.pg, dgtkjwdgj2355f.jpg und sdfgvkldjsvfajsd689.jpg zur id 23 gehören. Zurück dann mit explode und das Array durchlaufen. Wäre das ein Ansatz?
ratzekahl1
ratzekahl1 18.04.2023 um 16:54:15 Uhr
Goto Top
Google sagt mir noch, es gibt die Möglichkeit Bilder in der Datenbank zu speichern. Ich erinnere mich dunkel, dass ich ganz früher mal gelernt habe, dass das nicht gut ist und extrem auf die Performance geht.
Ist das heute noch so oder ist das mittlerweile best practice?

Weil dann könnte man einfach ein Tabelle machen:
id | vorgang_id | bild
1 | 112 | rgagrawgg
2 | 112 | gfsgsdg
3 | 112 | dtghrfsgsdg
4 | 112 | dfgsgfsda
5 | 115 | dfgagvfa
6 | 116 | dfrggsd

Dann wüsste ich 5 Bilder gehören zum Vorgang 112, 1 zu 115 und 1 zu 116
StefanKittel
StefanKittel 18.04.2023 um 17:16:46 Uhr
Goto Top
Du könntest die Bilder nennen
2023_04_18_17_16_29_SessionID und die Zugehörigkeit in einer Datenbank verwalten.
ratzekahl1
ratzekahl1 18.04.2023 um 19:27:18 Uhr
Goto Top
@StefanKittel Die Session ändert sich doch...
Oder meinst Du:
id | Name | Sessionid
1 | Bild1.jpg | edwkjtrwegjewjgwehjgwejg
2 | Bild2.jpg | edwkjtrwegjewjgwehjgwejg
3 | Bild3.jpg | sdlfgvafpafoasdfvdvadvadv

Mit Session_Start() erzeuge ich eine eindeutige id. Wenn ich die wegspeichere als 2023_04_18_17_16_29_SessionID Dann muss ich doch wissen, dass die die SessionId zum UrlaubId2 gehört. Wozu die Session?
Ich könnte doch auch
2023_04_18_17_16_29_UrlaubNordsee2023_1
2023_04_18_17_16_32_UrlaubNordsee2023_2
2023_04_18_17_16_33_UrlaubNordsee2023_3
2023_04_18_17_16_35_UrlaubNordsee2023_4

nehmen, oder? Irgendwie stehe ich auf der Leitung...
StefanKittel
StefanKittel 18.04.2023 um 23:53:13 Uhr
Goto Top
Hallo,
ne. Die Du willst ja keine doppelten Dateien.

Die Beschreibung würde ich nicht verwenden.
Da kann zu viel oder zu wenig drin stehen was man im Dateinamen nicht verwenden kann.
Auch könnte der Betreff doppelt sein. UrlaubDK (ohne Jahr)

SvezVRhtRQBC_0.jpg
SvezVRhtRQBC_1.jpg
SvezVRhtRQBC_2.jpg
SvezVRhtRQBC_3.jpg
8YS893CS8YS8_0.jpg
8YS893CS8YS8_1.jpg

Dazu passende Datenbankeinträge erstelen.

Oder erst die Datenbankeinträge erstellen und die Dateien mit der Auto-ID bennen.
0.jpg
1.jpg
2.jpg

Stefan
ratzekahl1
ratzekahl1 21.04.2023 um 09:05:22 Uhr
Goto Top
Guten Morgen,
also einfach einen Zufallsnahmen generieren und den der Urlaubsid zuordnen.
Wie verhindere ich dann den direkten Zugriff?

Domain von mir aus poempel.de und der Ordner Urlaub. Unterordner Medien.
Dann könnte ich über poemple.de/medien/SvezVRhtRQBC_0.jpg direkt die Bilder aufrufen, oder?

Kann ich das irgendwie verschleiern / maskieren, dass da sowas wie https://sdfbsdfdsds24r312d rauskommt.?

mfG
ratzekahl