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/Москва"
>
Москва
</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'=>'Москва',
'content'=>'55° 45′ N, 37° 37′ O'
),
'athen'=>array(
'htmlentities'=>'Αθήνα',
'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
Bitte fügen Sie einige grundlegende Informationen. Woher kommt '$ fileString'? Um welche Kodierung handelt es sich? –
Die Variable wird aus der Datenbank ausgewählt und verwendet. Sowohl instance_name als auch filestring – pks83