| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

24-03-2011, 07:59
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Downloadscript beschädigt Bilddateien
Ich habe ein PHP Script welches hochgeladene Dateien zum download anbietet.
Ich habe Probleme wenn Bilddateien hochgeladen werden, egal ob .jpg .gif. etc: Nach dem Download sind die Bilddateien beschädtig -> Keine Vorschau verfügbar. Auch .msi oder .exe Dateien sind nicht ausführbar/beschädigt.
.pdf Dateien zb. lassen sich nach dem Download komischerweise problemlos ausführen.
Ich habe mal eine heruntergeladene .png Datei mit einem Hex-Editor angesehen und herausgefunden das zusätzlich zwei Hex Werte mit dem Download mitgegeben werden.
Denn PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.
Das ist das Download Script:
PHP-Code:
<?php include_once("../upload/online.php"); $hash = $_GET['hash'];
$sql = "SELECT link FROM links WHERE hash = '".$hash."';"; $query = mysql_query($sql); $result = mysql_fetch_assoc($query); $url = $result['link'];
$ext = "SELECT filetype FROM links WHERE hash = '".$hash."';"; $query = mysql_query($ext); $result = mysql_fetch_assoc($query); $filetype = $result['filetype']; $dir = "../upload/"; if ((isset($url))&&(file_exists($dir.$url))) { header("Content-type: octet/stream"); header("Content-length: ".filesize($dir.$url.$filetype)); header('Content-Disposition: attachment; filename="download.'.$filetype.'"'); readfile("$dir$url"); } else { echo "No file selected"; } ?>
Wenn ich die hochgeladene Datei direkt vom Zielverzeichnis manuell herunterlade funktioniert es. Also es liegt an diesem Script. Nur an was?
Geändert von unixp (24-03-2011 um 08:13 Uhr)
|

24-03-2011, 08:12
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
Morgen.
Schau Dir mal die Diskussion zu dem Thema und zu Content-type: octet/stream an:
Wie kann ich Download erzwingen? - homepage-forum.de - Hilfe für Webmaster!
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

24-03-2011, 08:36
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
wird der nicht sowieso
PHP-Code:
header("Content-Type: application/octet-stream");
geschrieben ?
__________________
Wer LESEN kann, ist klar im Vorteil!
|

24-03-2011, 08:42
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
...genau das meinte ich  .
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

24-03-2011, 08:46
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Gut habe ich geändert. Aber immer noch das gleiche Problem.
Würde es was bringen wenn man alle einzelnen mime Werte manuell in das Script hinzufügt?
PHP-Code:
header('Content-type: {mime}'); //hier mime eintragen
{mime} = ersetzen durch mime, siehe: PluginDoc: Windows (Liste der MIME-Typen)
Edit:
ok an dem liegts auch nicht. Habe zum testen mal
PHP-Code:
header("Content-Type: image/jpeg"); header("Content-Type: image/jpg");
und eine jpeg Datei heruntergeladen -> Keine Vorschau verfügbar.
Geändert von unixp (24-03-2011 um 08:49 Uhr)
|

24-03-2011, 08:53
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

24-03-2011, 09:17
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Habe es mal wie im ersten Link aufgebaut. Allerdings speichert er jetzt alle Dateien mit genau 9bytes ab.
Mein Code:
PHP-Code:
<?php include_once("../upload/online.php"); $hash = $_GET['hash'];
$sql = "SELECT link FROM links WHERE hash = '".$hash."';"; $query = mysql_query($sql); $result = mysql_fetch_assoc($query); $url = $result['link'];
$ext = "SELECT filetype FROM links WHERE hash = '".$hash."';"; $query = mysql_query($ext); $result = mysql_fetch_assoc($query); $filetype = $result['filetype']; $dir = "../upload/"; $dateiname = basename($url); $groesse = filesize($dir.$url.$filetype); header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename="download.'.$filetype.'"'); header("Content-Length:".$groesse); readfile($dir.$url.$filetype); ?>
|

24-03-2011, 09:22
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
also ich liefere alle Dateien mit folgenden Code-Zeilen aus , egal was für ein Dateityp
PHP-Code:
$Dateiname = basename($Datei); $Groesse = filesize($Datei); $file=fopen($Datei,'r'); if ($file) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=\"".$Dateiname."\";"); header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: binary"); header('Content-Length: '.$Groesse ); flush(); while (!feof($file)) { print(fread($file,4096)); flush(); } } fclose($file); die();
an diesen Script-block übergibst du als $Datei den Pfad incl. Dateinamen (zb "/home/www/files/123.jpg" ) und den Rest machen die Header -Anweisungen ...
Nicht erschrecken, dass es soviele sind ... aber das war nötig, weil mein Script auch mitm IE 6 arbeiten muss .. Firefox kommt mit erheblich weniger Anweisungen aus, macht aber mit diesem Header-Aufruf auch das, was er soll
und bevor du fragst... erfolgreich getestet mit
Word-Dateien, Anwendungen, PDF, Bilder (png , jpeg, gif), CSV für Excel
__________________
Wer LESEN kann, ist klar im Vorteil!
|

24-03-2011, 12:38
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Ich habe mal diverse Content-Types getestet.
Aktuell hab ich die Konfig so:
PHP-Code:
<?php include_once("../upload/online.php"); $hash = $_GET['hash'];
$sql = "SELECT link FROM links WHERE hash = '".$hash."';"; $query = mysql_query($sql); $result = mysql_fetch_assoc($query); $url = $result['link'];
$ext = "SELECT filetype FROM links WHERE hash = '".$hash."';"; $query = mysql_query($ext); $result = mysql_fetch_assoc($query); $filetype = $result['filetype']; $dir = "../upload/"; if ((isset($url))&&(file_exists($dir.$url))) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-length: ".filesize($dir.$url)); header("Content-Disposition: attachment; filename=\"".$url."\";"); header("Content-Description: File Transfer"); header("Content-Transfer-Encoding: binary"); readfile("$dir$url"); } else { echo "No file selected"; } ?>
Die config ähnelt deiner. Ich verstehe bloss nicht wo er etwas dem Download "mitgibt" damit es nicht funktioniert und die Dateien beschädigt sind.
|

24-03-2011, 12:55
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von unixp
Ich habe mal eine heruntergeladene .png Datei mit einem Hex-Editor angesehen und herausgefunden das zusätzlich zwei Hex Werte mit dem Download mitgegeben werden.
|
Und welche ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-03-2011, 13:22
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Ich erhalte den zusätzlichen Wert 20 0A 0A, siehe:
http://www.abload.de/img/hexcode1dfc.jpg
PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.
Bloß wodurch wird das ausgelöst?
|

24-03-2011, 13:30
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von unixp
Ich erhalte den zusätzlichen Wert 20 0A 0A
|
Also ein Leerzeichen und zwei Linefeeds.
Zitat:
|
Bloß wodurch wird das ausgelöst?
|
Vermutlich dadurch, dass es irgendwo in deinem PHP-Script drin steht - außerhalb der <?php ... ?>-Bereiche.
Dass du damit keine “headers already sent”-Fehlermeldung bekommst, liegt wohl an aktiviertem output buffering. (Wenn du die Stelle also nicht selber findest, dann output buffering mal deaktivieren - dann wird die Meldung dich darauf hinweisen, an welcher Stelle diese Ausgabe stattfand.)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-03-2011, 14:11
|
|
unixp
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 6
|
|
Ich habe in der /etc/php5/apache2/php.ini das output_buffering von 4096 auf Off gestellt.
Ich erhalte dann beim Download nur Hieroglyphen im Fenster als Ausgabe.
Ich habe nochmal das komplette Script auf falsche Leerzeichen und Umbrüche geprüft aber nichts gefunden...
|

24-03-2011, 14:14
|
|
JensClasen
Registrierter Benutzer
|
|
Registriert seit: Mar 2011
Beiträge: 1
|
|
Zitat:
Zitat von unixp
PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei mir steht was davor, und das ist für meine Probleme verantwortlich.
|
Also crosspostings find ich ja schon frech - aber der hier ist besonders frech...
In diesem Thread steht:
Zitat:
|
Zitat von Jens Clasen
PNG-Dateien starten immer mit 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A. Das ist die Erkenntnis aus der Hexeditor-Nummer. Bei Dir steht was davor, und das ist für Deine Probleme verantwortlich.
In Deinem Fall halt ein Leerzeichen (0x20) hinter ?> und drei Zeilenumbrüche (0x0A) danach. Im Include stehen keine mehr - das würde man im Hexeditor sonst gesehen haben.
|
Dazu fällt mir langsam nichts mehr ein...
Gruß Jens
|

24-03-2011, 14:15
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
dann guck auch mal was VOR <?PHP steht ^^
ein Leerzeichen und 2 mal Enter vermutlich
__________________
Wer LESEN kann, ist klar im Vorteil!
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|