0

我有这个页面应该是一首歌的下载。下载对我来说在 Firefox 中有效,但在 chrome 和 safari 中没有任何反应..这是我的代码

    public function download() {
    if (isset($this->request->get['order_download_id'])) {
        $order_download_id = $this->request->get['order_download_id'];
    } else {
        $order_download_id = 0;
    }
    $download_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_download od LEFT JOIN `" . DB_PREFIX . "order` o ON (od.order_id = o.order_id) WHERE o.customer_id = '" . (int)$this->customer->getId(). "' AND o.order_status_id > '0' AND o.order_status_id = '" . (int)$this->config->get('config_download_status') . "' AND od.order_download_id = '" . (int)$order_download_id . "'");

    if ($download_info->row) {
        $file = DIR_DOWNLOAD . $download_info->row['filename'];
        $mask = basename($download_info->row['mask']);
        $mime = 'application/octet-stream';
        $encoding = 'binary';

        if (!headers_sent()) {
            if (file_exists($file)) {
                header('Pragma: public');
                header('Expires: 0');
                header('Content-Description: File Transfer');
                header('Content-Type: ' . $mime);
                header('Content-Transfer-Encoding: ' . $encoding);
                header('Content-Disposition: attachment; filename="' . ($mask ? $mask : basename($file)) . '"');
                header('Content-Length: ' . filesize($file));
                $file = readfile($file, 'rb');
                print($file);
            } else {
                exit('Error: Could not find file ' . $file . '!');
            }
        } else {
            exit('Error: Headers already sent out!');
        }
    }
}

我已经尝试了各种不同的方法来使其正常工作,但是两个浏览器中都没有发生任何事情......任何想法或帮助将不胜感激......

4

2 回答 2

3

readfile returns the number of bytes sent, and needs not to be printed out. You should remove the line print($file);. Otherwise, you'll send more bytes than the Content-Length header specifies, and that will lead some HTTP clients to discard your answer.

Also, consider strange file names such as

"\r\nLocation: http://evil.com\r\n\r\n<script>alert('XSS');</script>

Are you handling that correctly?

于 2011-07-02T20:11:11.263 回答
0

在附近查看您的语法

header('Content-Disposition: attachment; filename="'.$file_name_with_space. '"');

或者它可以是

header("Content-Disposition: attachment; filename='".$file_name_with_space."'" );

此处游戏仅在引号中,如果写入正确,它将被视为字符串的一部分,否则将崩溃。

它适用于所有浏览器。IE, FF, Chrome, SAFARI 我亲自检查过,所以很顺利。

于 2012-02-02T09:47:10.977 回答