b-free
Goto Top

PHP Downloadzwang-Script sägt Dateinamen nach Leerzeichen ab!

Hallo,

mein (naja. Es ist nicht direkt "mein") script hat probleme mit leerzeichen in dateinamen.

<?php
session_start();
if ($_SESSION['login'] == true && $_SESSION['user'] != "") {  

$pfaduser = $_GET['pu'];  
$downloaduser = $_GET['du'];  
$datei = $_GET['da'];  

if ($pfaduser == "" || $downloaduser == "" || $datei == "") {  
	## Eine (oder mehrere) der übermittelten Parameter sind leer!
	header ('Location: http://www.example.domain/index.php?f=para&logout=true');  
	echo "<script>window.close();</script>";   
	exit;  
}
else {
	## Alle Parameter sind gesetzt
	if (file_exists("daten/".$pfaduser."/".$datei."")) {  
		## Die datei die heruntergeladen werden soll existiert
		if (file_exists("daten/".$pfaduser."/".$datei.".#sav")) {  
			## Die datei die heruntergeladen werden soll ist freigegeben
			$datei = "daten/".$pfaduser."/".$datei;  
			$dateiname = basename($datei);
			$groesse = filesize($datei);
			header("Content-Type: application/force-download");  
			header("Content-Disposition: attachment; filename=".$dateiname);  
			header("Content-Length:".$groesse);  
			readfile($datei);
		}
		else {
			## Die datei die heruntergeladen werden soll ist nicht freigegeben
			echo "<div id='bs'><div id='error'><h1>Fehler!</h1>Die ausgewählte Datei steht nicht zum Download freigegeben!<br></div></div>";  
		}
	}
	else {
		## Die datei die heruntergeladen werden soll existiert nicht
		echo "<div id='bs'><div id='error'><h1>Fehler!</h1>Die Datei existiert nicht mehr!.<br></div></div>";  
	}
}
}
else {
	header ('Location: http://www.example.domain/index.php?f=login&logout=true');  
	echo "<script>window.close();</script>";   
	exit;  
}
echo "<script>window.close();</script>";   
?>

Das Problem:
Wenn ein Leerzeichen (space) im Dateiname ist, wird der Dateiname nur bis zum ersten Leerzeichen angezeigt. (Dateiendung geht auch flöten...)
Außerdem, tritt das Problem nur im Mozilla auf...
Opera, zeigt den Dateinamen erst ab klammer auf an, bzw. den ganzen Dateinamen, wenn keine klammern vorkommen.
Internet Explorer verhackstückelt die umlaute (äöü).

Die Lösung (dachte ich):
urlencode

Hat leider nicht geklappt...

Tschau
B-Free

Content-ID: 217753

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

110135
110135 24.09.2013 um 22:54:43 Uhr
Goto Top
Hallo,

wie wäre es damit, wenn du die Umlaute durch AE OE und UE ersetzt... ist für die Kodierung auch schöner, da nicht unbedingt jedes System mit ISO oder UTF-8 arbeitet...

Ändere deine Zeile 25 folgendermaßen ab, um das mit den Leerzeichen zu lösen:
			header("Content-Disposition: attachment; filename='".$dateiname.'"");   

Ich denke, dann funktioniert's.

Gruß,
Florian.
B-free
B-free 25.09.2013 um 13:20:54 Uhr
Goto Top
Erstmal Danke!
wie wäre es damit, wenn du die Umlaute durch AE OE und UE ersetzt... ist für die Kodierung auch
schöner, da nicht unbedingt jedes System mit ISO oder UTF-8 arbeitet...

Das geht leider nicht, da ich nicht bestimmen kann, welche Dateien hoch geladen werden.

Den 2. Tipp werde ich gleich mal ausprobieren...

Tschau
B-Free
colinardo
colinardo 25.09.2013 um 14:36:33 Uhr
Goto Top
Hallo B-Free,
deine URL-Parameter erhältst du in PHP bereits URL-Kodiert geliefert. Einen String mit einem Leerzeichen z.B. Herbert Meier kommt dann so in PHP an: Herbert%20Meier. In PHP musst du dann urldecode nutzen um den String wieder zurückzuwandeln:
urldecode($_GET['da']);

Grüße Uwe
B-free
B-free 25.09.2013 aktualisiert um 17:50:56 Uhr
Goto Top
Hallo colinardo,

das habe ich leider schon probiert... die Variable wird zwar komplett überliefert, aber der Fehler liegt anscheinend da:
			header("Content-Disposition: attachment; filename=".$dateiname);   
Wenn ich die Variable vorher ausgebe, wird sie komplett ausgegeben. anscheinend, wird lediglich das Leerzeichen falsch interpretiert.

@110135
Dein Script geht leider auch nicht...

selbst:
			header("Content-Disposition: attachment; filename=$dateiname");   

wenn ich den Link mit Anführungszeichen oben beginne gehts auch nicht...

...

Nach langem *rumprobieren* hab ich ne einigermaßen gut Lösung gefunden... naja eig. ist sie schlecht.

ABER sie funktioniert:
$dateiname = str_replace(" ", "-", $dateiname);  

So...

Zum Schluss noch ne Frage:

Kann ich den Bindestrich durch irgendwas ersetzen, das wenigstens so aussieht, als wäre es ein Leerzeichen... *edit* und von Mozilla erkannt wird???

Aber erst mal trotzdem DANKE :D

Tschau
B-Free
colinardo
colinardo 25.09.2013 um 19:15:56 Uhr
Goto Top
Hallo B-Free,
Les mal die folgenden Threads zur Kompatibilität von Zeichen in diesem Header-Field:

Apropos header:
ich würde anstatt "Force-Download" das hier verwenden, da es Browsertechnisch weniger Fehler verursacht:
header('Content-Type: application/octet-stream');

Grüße Uwe