Принудительная загрузка с использованием шведских символов (åäö) имя_файла

Я использую следующий код и функцию для принудительной загрузки файлов, и они отлично работают, если имя файла не содержит шведских символов, таких как Å Ä Ö.

$file_id = $_GET['f'];

$sql =  " SELECT * ".
            " FROM attachment ".
            " WHERE attachment_id = ".$file_id." ".

            $res = mysql_query($sql);
            $row = mysql_fetch_array($res);
            $filename = $row['filename'];
            $USER_ID = $row['user_id'];
            $Directory_id = $row['directory_id'];
            $target_path = "upload/".$USER_ID."/".$Directory_id."/";


function Download($path, $speed = null)
{
    if (is_file($path) === true)
    {
        $file = @fopen($path, 'rb');
        $speed = (isset($speed) === true) ? round($speed * 1024) : 524288;

        if (is_resource($file) === true)
        {
            set_time_limit(0);
            ignore_user_abort(false);

            while (ob_get_level() > 0)
            {
                ob_end_clean();
            }

            header('Expires: 0');
            header('Pragma: public');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Content-Type: application/octet-stream');
            header('Content-Length: ' . sprintf('%u', filesize($path)));
            header('Content-Disposition: attachment; filename="' . basename($path) . '"');
            header('Content-Transfer-Encoding: binary');

            while (feof($file) !== true)
            {
                echo fread($file, $speed);

                while (ob_get_level() > 0)
                {
                    ob_end_flush();
                }

                flush();
                sleep(1);
            }

            fclose($file);
        }

        exit();
    }

    return false;

    }
Download($target_path.$filename);

Я попытался разместить это вверху своей страницы:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

И:

$filename = urlencode($filename); 

Or:

$filename =  htmlentities($filename, ENT_QUOTES, "UTF-8");

Но все та же проблема, не могу их открыть. Но если имя файла содержит нормальный английский символ, то оно работает нормально.

Есть ли у вас какие-либо предложения, что я могу добавить или реализовать для этой функции? Любая помощь, которую вы можете оказать, будет принята с благодарностью.


person Jonas Willander    schedule 08.05.2014    source источник
comment
Вы можете попробовать: $ filename = iconv ('UTF-8', 'ASCII // TRANSLIT', $ filename);   -  person Vincent Decaux    schedule 08.05.2014
comment
Возможно, это должно вам помочь: stackoverflow.com/questions/93551/   -  person Lukas Hajdu    schedule 08.05.2014
comment
Какую кодировку php-файла вы используете?   -  person bksi    schedule 08.05.2014
comment
@ Винсент Деко, спасибо Винсенту за повтор, но это та же проблема. Я пробовал $ path = iconv ('UTF-8', 'ASCII // TRANSLIT', $ path)   -  person Jonas Willander    schedule 08.05.2014
comment
@Lukas Hajdu, спасибо за ваш ответ, но это было слишком много информации, и я не понимал, что делать.   -  person Jonas Willander    schedule 09.05.2014
comment
@bksi Вы про какой файл? документы, pdf .....   -  person Jonas Willander    schedule 09.05.2014
comment
Нет, я имею в виду файл php, который должен повторять этот материал. Если у него другая кодировка, это может вызвать проблемы   -  person bksi    schedule 09.05.2014
comment
@bksi Hell Bksi. Сейчас отредактировал. Вы можете увидеть, как я получаю filnename и как я вызываю функцию   -  person Jonas Willander    schedule 09.05.2014
comment
@bksi ... Прости, черт возьми, Bksi = Привет, Bksi .....;)   -  person Jonas Willander    schedule 10.05.2014
comment
Нет человека. каждый файл закодирован в вашей файловой системе. Какую кодировку вы используете при написании файлов php? В вашем редакторе php вы можете легко проверить.   -  person bksi    schedule 10.05.2014
comment
@bksi, ага, теперь я тебя понимаю. Это UTF-8, ЗАГРУЗИТЬ КАК UTF-8.   -  person Jonas Willander    schedule 10.05.2014


Ответы (1)


Убедитесь, что в вашем html-документе используется кодировка utf8 (<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>)

Попробуйте заменить

$filename = $row['filename'];

с участием

$filename = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $row['filename']);   

Итак, ваш код будет выглядеть так:

$file_id = $_GET['f'];

$sql =  " SELECT * ".
            " FROM attachment ".
            " WHERE attachment_id = ".$file_id." ".

            $res = mysql_query($sql);
            $row = mysql_fetch_array($res);
            $filename = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $row['filename']);   
            $USER_ID = $row['user_id'];
            $Directory_id = $row['directory_id'];
            $target_path = "upload/".$USER_ID."/".$Directory_id."/";

Но тогда ради этого. Не используйте mysql () - функции. Вместо этого используйте mysqli или PDO с заполнителями. Ваш код широко используется для атак с использованием sql-инъекций.

person bestprogrammerintheworld    schedule 10.05.2014