2015-08-05 10 views
7

Ich stolperte auf seltsame Weise, um Dateien zu schützen.herunterladen Dateien mit Leerzeichen in ihrem Namen - Einschränkung durch htaccess

Basicly ist leer download.php Datei im geschützten Ordner und zwei Dateien, die Datei verursacht (aus dem gleichen Ordner) heruntergeladen werden: .htpwd wo Passwort gespeichert und .htaccess:

RewriteEngine On 
##RewriteBase/
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] 
RewriteRule \.(.*)$ - [NC,F,L] 

RewriteCond %{QUERY_STRING} ^filename=(.*)$ 
RewriteRule ^download\.php$ %1 
RewriteRule (.*) - [E=file:$1] 
Header set Content-type "octet-stream" 
Header set Content-disposition "attachment; filename=%{file}e" env=file 

##AuthName "Restricted Access" 
##AuthType Basic 
##AuthUserFile /local/home/example/example.com/downloads/.htpwd 
##AuthGroupFile /dev/null 
##require valid-user 

Beispiel Download-Link:
http://www.example.com/downloads/download.php?filename=dog%20cat%20cow.zip

Wenn der Dateiname ist dog-cat-cow.zip - alles funktioniert. Das Problem beginnt, wenn der Dateiname lautet: "dog cat cow.zip", dann wird die Datei heruntergeladen, aber der Dateiname nach dem Download lautet "dog" statt "dog cat cow.zip". Das Problem ist, dass Leute Dateien ohne Erweiterung erhalten und keine Ahnung haben, was damit zu tun ist.

Wie kann das gelöst werden, wenn man bedenkt, dass ich diese Dateien einfach nicht umbenennen und Leerzeichen entfernen kann? Ich bin kein Experte, wie man .htaccess liest und keine Phrase, die ich mir vorstellen könnte, gibt eine ähnliche Problemlösung. Irgendwelche Ideen?

+4

empfehle ich Ihnen so etwas wie dieses 'Header gesetzt Content-disposition "attachment; filename = '% {file} e'" env = file', Dateinamen in Anführungszeichen – anonymous

+1

Wie @anonymous sagt, da der Dateiname hat Leerzeichen benötigen Sie Anführungszeichen. Für was ist das extra 'e'? – MrWhite

+0

"aber sein Dateiname nach dem Download" - Sie können den Browser dazu veranlassen, immer nach dem Speicherort des Downloads zu fragen (empfohlen) - der Benutzer kann den Dateinamen zu diesem Zeitpunkt korrigieren. – MrWhite

Antwort

1

Wie in den Kommentaren erwähnt, vielleicht versuchen:

RewriteEngine On 
##RewriteBase/
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] 
RewriteRule \.(.*)$ - [NC,F,L] 

RewriteCond %{QUERY_STRING} ^filename=(.*)$ 
RewriteRule ^download\.php$ %1 
RewriteRule (.*) - [E=file:$1] 
Header set Content-type "octet-stream" 
Header set Content-disposition "attachment; filename='%{file}'" env=file 

##AuthName "Restricted Access" 
##AuthType Basic 
##AuthUserFile /local/home/example/example.com/downloads/.htpwd 
##AuthGroupFile /dev/null 
##require valid-user 

Alternativ, warum nicht setzen Sie den Inhaltstyp und Disposition in Ihrer download.php Datei selbst?

$fileStorageDirectory = '/the/folder/the/downloadable/files/are/in/'; 

// Check for Parameter 
if(!isset($_GET['filename']) || $_GET['filename']==''){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('No File Specified'); 
} 

$fileName = trim($_GET['filename']); 
$fileRequested = $fileStorageDirectory.$fileName; 
// Check File Exists 
if(!file_exists($fileRequested)){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('File Not Found'); 
} 
// Check File is Readable 
if(!is_readable($fileRequested)){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('File Not Accessible'); 
} 
// Send the File 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.fileName.'"'); 
readfile($fileRequested); 
exit; 
Verwandte Themen