【问题标题】:Force download with Swedish characters (åäö) filename [duplicate]使用瑞典语字符 (åäö) 文件名强制下载 [重复]
【发布时间】:2014-06-26 06:21:36
【问题描述】:

我使用以下代码和函数来强制下载文件,如果文件名不包含瑞典字符(如 Å Ä Ö),它会很好地工作。

$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); 

或者:

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

但还是同样的问题,我打不开。但是如果文件名包含正常的英文字符,那么它就可以正常工作。

您有什么建议我可以为该功能添加或实现什么?非常感谢您提供的任何帮助。

【问题讨论】:

  • 你可以试试:$filename = iconv('UTF-8', 'ASCII//TRANSLIT', $filename);
  • 也许这对你有帮助:stackoverflow.com/questions/93551/…
  • 你使用的php文件的编码是什么?
  • @Vincent Decaux ,感谢文森特的重播,但这是同样的问题。我试过 $path = iconv('UTF-8', 'ASCII//TRANSLIT', $path)
  • @Lukas Hajdu 感谢您的回复,但信息太多,我不知道该怎么做。

标签: php special-characters force-download


【解决方案1】:

确保您的 html 文档中有 utf8 编码 (&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt;)

尝试替换

$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 注入攻击。

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多