name des file bei download aus mysql

speedone

New Member
Ich habe folgende kleine Frage.

Ich habe ein Uploadscript gemacht, dass Dateien im Binär Format in einer Mysql speichert.

Ich habe eine spalte mit Longblob für die Binärdaten und eine für den Dateinnamen.

Bis jetzt downloade ich so das file und das klappt auch:
Allerdings heißt so jeder Download: download.*
Ich möchte aber, dass er den namen aus der spalte der Tabelle nimmt und dann unter diesem namen herunterläd.

Dateiname: download.php
PHP:
<?php
 if (isset($_REQUEST['id'])){
  $id=$_REQUEST['id'];
  $db=mysql_connect("localhost","root","")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  mysql_query("USE hadabank")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  $anfrage="SELECT datei FROM downloadarchiv_data WHERE id='".$id."'";
  $ergebnis=mysql_query($anfrage)
    or die ("Datenbankerror: ".mysql_error($db));
  if ($ergebnis) {
   $zeile=mysql_fetch_row($ergebnis);
   $data=$zeile[0];
   header("Content-Type:audio/mpeg");
   print ($data);
  }
  mysql_close($db);
 }
?>

Dateiname: archiv.php
PHP:
<?php

 $db=mysql_connect("localhost","root","");
 $anfrage="USE hadabank";
 mysql_query($anfrage);

 $anfrage="SELECT * FROM downloadarchiv_data";
 $ergebnis=mysql_query($anfrage);
 if ($ergebnis) {
  $anz=mysql_num_rows($ergebnis);
  print ("<table border='1'>");
  print ("<th>Songname</th><th>Beschreibung</th>");
  print ("<th>Dateigröße<br>(kByte)</th>");
  for ($a=0; $a<$anz;$a++) {
   print ("<tr>");
   $zeile=mysql_fetch_row($ergebnis);
   print ("<td>");
   print ("<a href='download.php?id=".$zeile[0]."'>".$zeile[1]."</a></td>");
   print ("<td>".$zeile[2]."</td>");
   print ("<td>".round(($zeile[3]/1024),2)."</td></tr>");
  }
 print ("</table>");
 }
 else {
  print ("Zur Zeit leider keine Dateien zum Download");
 }
 mysql_close($db);
?>
 
Last edited by a moderator:
Mal ne andere Frage, weil es mir gerade auffällt:
Bist du dir sicher, dass du
Code:
$_REQUEST[id]
einfach so übergeben willst, ohne zu testen? Das schreit nach ner SQL_injection!
 
So klappts!
Werde nochmal zusätzlich die Id überprüfen lassen...
Danke fürr die schnellen Antworten

PHP:
<?php
 if (isset($_REQUEST['id'])){
  $id=$_REQUEST['id'];
  $db=mysql_connect("localhost","root","")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  mysql_query("USE hadabank")
    or die ("Keine Verbindung zum Datenbankserver: ".mysql_error($db));
  $anfrage="SELECT datei, dateiname FROM downloadarchiv_data WHERE id='".$id."'";
  $ergebnis=mysql_query($anfrage)
    or die ("Datenbankerror: ".mysql_error($db));
  if ($ergebnis) {
   $zeile=mysql_fetch_row($ergebnis);
   $data=$zeile[0];
   $filename=$zeile[1];
   header("Content-Type:audio/mpeg");
   header("Content-Disposition: attachment; filename=$filename");
   print ($data);
  }
  mysql_close($db);
 }
?>
 
Last edited by a moderator:
Du willst dir unbedingt sprintf() ansehen...
Was, wenn jemand als id das hier reinreicht?:
Code:
1'; DELETE FROM downloadarchiv_data; --
Das ist, was Mordor meinte.
 
Last edited by a moderator:
Back
Top