Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung PHP

Mitglied: B-free

B-free (Level 1) - Jetzt verbinden

24.09.2013 um 18:32 Uhr, 3271 Aufrufe, 5 Kommentare, 1 Danke

Hallo,

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

01.
<?php 
02.
session_start(); 
03.
if ($_SESSION['login'] == true && $_SESSION['user'] != "") { 
04.
 
05.
$pfaduser = $_GET['pu']; 
06.
$downloaduser = $_GET['du']; 
07.
$datei = $_GET['da']; 
08.
 
09.
if ($pfaduser == "" || $downloaduser == "" || $datei == "") { 
10.
	## Eine (oder mehrere) der übermittelten Parameter sind leer! 
11.
	header ('Location: http://www.example.domain/index.php?f=para&logout=true'); 
12.
	echo "<script>window.close();</script>";  
13.
	exit;   
14.
15.
else
16.
	## Alle Parameter sind gesetzt 
17.
	if (file_exists("daten/".$pfaduser."/".$datei."")) { 
18.
		## Die datei die heruntergeladen werden soll existiert 
19.
		if (file_exists("daten/".$pfaduser."/".$datei.".#sav")) { 
20.
			## Die datei die heruntergeladen werden soll ist freigegeben 
21.
			$datei = "daten/".$pfaduser."/".$datei
22.
			$dateiname = basename($datei); 
23.
			$groesse = filesize($datei); 
24.
			header("Content-Type: application/force-download"); 
25.
			header("Content-Disposition: attachment; filename=".$dateiname); 
26.
			header("Content-Length:".$groesse); 
27.
			readfile($datei); 
28.
29.
		else
30.
			## Die datei die heruntergeladen werden soll ist nicht freigegeben 
31.
			echo "<div id='bs'><div id='error'><h1>Fehler!</h1>Die ausgewählte Datei steht nicht zum Download freigegeben!<br></div></div>"
32.
33.
34.
	else
35.
		## Die datei die heruntergeladen werden soll existiert nicht 
36.
		echo "<div id='bs'><div id='error'><h1>Fehler!</h1>Die Datei existiert nicht mehr!.<br></div></div>"
37.
38.
39.
40.
else
41.
	header ('Location: http://www.example.domain/index.php?f=login&logout=true'); 
42.
	echo "<script>window.close();</script>";  
43.
	exit;   
44.
45.
echo "<script>window.close();</script>";  
46.
?>
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):
01.
urlencode
Hat leider nicht geklappt...

Tschau
B-Free
Mitglied: flow.ryan
24.09.2013 um 22:54 Uhr
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:
01.
			header("Content-Disposition: attachment; filename='".$dateiname.'""); 
Ich denke, dann funktioniert's.

Gruß,
Florian.
Bitte warten ..
Mitglied: B-free
25.09.2013 um 13:20 Uhr
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
Bitte warten ..
Mitglied: colinardo
25.09.2013 um 14:36 Uhr
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
Bitte warten ..
Mitglied: B-free
25.09.2013, aktualisiert um 17:50 Uhr
Hallo colinardo,

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

@flow.ryan
Dein Script geht leider auch nicht...

selbst:
01.
			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:
01.
$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
Bitte warten ..
Mitglied: colinardo
25.09.2013 um 19:15 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...