2010-04-05 3 views
5

Wenn ich versuche, eine Datei herunterladen, deren Name Zeichen aus Sprachen wie Chinesisch Japanisch usw. ...... nicht ASCII ... heruntergeladen hat Dateiname ist verstümmelt. Wie man es korrigiert.beim Herunterladen von Dateinamen aus nicht-Englisch-Sprachen werden nicht auf der heruntergeladenen Datei korrekt angezeigt

Ich habe versucht, charset = UTF-8 in der Content-Type-Header-Eigenschaft, aber keinen Erfolg. Bitte helfen Sie. Code unten.

header ("Cache-Control: "); // leer lassen IE Fehler vermeiden

header (" Pragma: "); // leer lassen IE Fehler

Header zu vermeiden (" Content -type: application/octet-stream ");

header ("Inhaltsdisposition: Anhang; Dateiname = \" ". $ Instanzname." \ "");

header ("Inhaltslänge:". (Zeichenfolge) (Dateigröße ($ fileString)));

Schlaf (1);

fpassthru ($ fdl);

+1

Bitte fügen Sie einige grundlegende Informationen. Woher kommt '$ fileString'? Um welche Kodierung handelt es sich? –

+0

Die Variable wird aus der Datenbank ausgewählt und verwendet. Sowohl instance_name als auch filestring – pks83

Antwort

9

Leider gibt es derzeit keine einzige Lösung, die mit allen Browsern funktioniert. Es gibt mindestens drei "offensichtlichere" Ansätze für das Problem.

a) Content-type: application/octet-stream; charset=utf-8 + filename=<utf8 byte sequence>
z.B. filename=Москва.txt
Dies ist ein Verstoß gegen Standards, aber Firefox zeigt den Namen korrekt. IE nicht.

b) Content-type: application/octet-stream; charset=utf-8 + filename=<urlencode(utf8 byte sequence)>
z.B. filename=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
Dies funktioniert mit IE, aber nicht mit Firefox.

c) Bereitstellen des Namens wie angegeben in rfc 2231
z.B filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.txt
Wieder firefox dies unterstützt, funktioniert also nicht.

für einen umfassenden Vergleich http://greenbytes.de/tech/tc2231/


bearbeiten sehen: Als ich sagte, dass es keine einheitliche Lösung, ich via Header gemeint ('...'). Aber es gibt etwas von einer Arbeit um.
Wenn es keinen verwendbaren Dateinamen gibt = xyz Header-Browser verwenden den Basisnamen des Pfadteils der URL. I.e. für <a href="test.php/lala.txt"> beide Firefox und IE vorschlagen lalala.txt als Dateiname.
Sie können fügen Sie zusätzliche Pfadkomponenten nach dem tatsächlichen Pfad zu Ihrem PHP-Skript (bei Apache httpd siehe http://httpd.apache.org/docs/2.1/mod/core.html#acceptpathinfo).
Zum Beispiel Wenn Sie eine Datei test.php in Ihrem Dokumentenstammverzeichnis haben und diese als http://localhost/test.php/x/y/z anfordern, enthält die Variable $_SERVER['PATH_INFO'] .
Nun, wenn Sie einen Link wie

<a 
    href="/test.php/download/moskwa/&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;" 
> 
    &#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430; 
</a> 

in Ihrem Dokument platzieren können Sie den download/moskwa/... Teil holen und den Download der Datei initiieren. Ohne irgendwelche Dateinamen = ... Informationen zu senden, schlagen sowohl Firefox als auch IE den "richtigen" Namen vor.
Sie können es sogar mit dem Senden des Namens gemäß RFC 2231 kombinieren. Deshalb setze ich auch moskwa in den Link. Das wäre die ID, die das Skript verwendet, um die Datei zu finden, die es senden soll. Der IE ignoriert die Informationen filename*=... und verwendet weiterhin den Basisnamen-Teil der URL, um einen Namen vorzuschlagen. Das bedeutet für Firefox (und jeden anderen Client, der RFC 2231 unterstützt), dass der Teil nach der ID bedeutungslos ist *, aber für den IE (und andere Clients, die RFC 2231 nicht unterstützen) würde er für den Namensvorschlag verwendet werden.
umluftunabhängigem Beispiel:

<?php // test.php 
$files = array(
    'moskwa'=>array(
    'htmlentities'=>'&#x41c;&#x43e;&#x441;&#x43a;&#x432;&#x430;', 
    'content'=>'55° 45′ N, 37° 37′ O' 
), 
    'athen'=>array(
    'htmlentities'=>'&#x391;&#x3b8;&#x3ae;&#x3bd;&#x3b1;', 
    'content'=>'37° 59′ N, 23° 44′ O' 
) 
); 


$fileid = null; 
if (isset($_SERVER['PATH_INFO']) && preg_match('!^/download/([^/]+)!', $_SERVER['PATH_INFO'], $m)) { 
    $fileid = $m[1]; 
} 

if (is_null($fileid)) { 
    foreach($files as $fileid=>$bar) { 
    printf(
     '<a href="./test.php/download/%s/%s.txt">%s</a><br />', 
     $fileid, $bar['htmlentities'], $bar['htmlentities'] 
    ); 
    } 
} 
else if (!isset($files[$fileid])) { 
    echo 'no such file'; 
} 
else { 
    $f = $files[$fileid]; 
    $utf8name = mb_convert_encoding($f['htmlentities'], 'utf-8', 'HTML-ENTITIES'); 
    $utf8name = urlencode($utf8name); 

    header("Content-type: text/plain"); 
    header("Content-Disposition: attachment; filename*=UTF-8''$utf8name.txt"); 
    header("Content-length: " . strlen($f['content'])); 
    echo $f['content']; 
} 

*) ist das ein bisschen wie hier auf Stack-Überlauf. Der Link auf diese Frage ist, wie

gezeigt
http://stackoverflow.com/questions/2578349/while-downloading-filenames-from-non-english-languages-are-not-getting-displayed 

aber es funktioniert auch mit

http://stackoverflow.com/questions/2578349/mary-had-a-little-lamb 

der wichtige Teil ist die ID 2578349

+0

+1 die beste Antwort, die ich je zu diesem Thema gesehen habe. Danke für den Link. Das geht in meine Favoritenbox. –

+0

Vielen Dank für die Bereitstellung der detaillierten Erklärung wirklich geholfen, das Problem tiefer zu verstehen. Danke – pks83

+0

Hallo Volkerk, Irgendwelche Eingaben, wie man mit Safari umgeht? – pks83

0

Ich denke, wenn Sie versuchen, anderen Zeichensatz hinzuzufügen, wird Sie proplem beheben.

Wenn das Problem immer noch denke ich müssen Sie Sprachen-Dateien von XP CD zu Ihrem System installieren, denn wenn das System nicht die richtigen Zeichen findet, wird es ungerade hinzufügen.

Ich hatte ein Problem wie dieses mit arabischer Sprache, aber ich finde, dass ich nicht alle Sprachdateien in mein System kopiert habe.

Hoffe, das wird Ihnen helfen.

Verwandte Themen