【问题标题】:Downloading files as attachment filesize incorrect下载文件作为附件文件大小不正确
【发布时间】:2013-01-18 17:04:35
【问题描述】:

我正在尝试强制链接以将文件作为附件下载。这是我以前做过的事情,但是出了点问题,我不确定是什么。我尝试作为附件发送的文件类型都是 mp4 文件。这是我正在做的事情:

<?php
if(isset($_GET['file']))
{
    $file_path = dirname(__FILE__) . "/videos/$_GET[file]";
    if(file_exists($file_path))
    {

        $file_url = "/videos/$_GET[file]";
        header ("Content-type: video/mp4");
        header("Content-Transfer-Encoding: binary"); 
        header("Content-disposition: attachment; filename=\"".basename($_GET['file']) ."\""); 
        header("Content-Length: ".filesize($file_path));
        echo readfile($file_url);
    }
}
?>

如您所见,我在尝试提供文件之前检查文件是否存在。发生的情况是我得到了文件,它的类型是正确的(MP4 视频),但文件的大小只有 100 字节左右。在调试时,我测试了文件大小是否正确,是的。我已将 readfile() 行更改为: header("location:/videos/$_GET[file]");

然后它带我去看视频。我已经做了很多谷歌搜索,但我没有想出这种行为的原因。有没有人见过这种类型的东西?关于可能导致这种情况的任何想法?任何帮助将不胜感激,非常感谢!

【问题讨论】:

    标签: php header force-download


    【解决方案1】:

    如果您在文本编辑器中打开您下载的文件的内容,您无疑会看到一条错误消息。这可能是因为您的路径以/ 开头。当您从磁盘打开文件时,您的服务器路径的 doc root 是没有意义的。您需要指定真实路径。

    另外,您的脚本非常不安全!任何人都可以从您的服务器上下载他们想要的任何文件。确保在提供文件之前检查该文件是否位于 doc 根目录中。 从不让用户不受限制地指定他们想要的任何文件。你不想做一些事情?file=../../../etc/passwd。

    【讨论】:

    • 啊!当我应该使用 $file_path 时,我正在使用 $file_url ,不知道我怎么没看到。对于我实际所做的精简版本的记录,完整版本有安全检查,但感谢您指出。非常感谢!
    【解决方案2】:

    使用这些功能,对你有帮助。

    function getRemoteFilesize($url)
    {
        $file_headers = @get_headers($url, 1);
        if($size =getSize($file_headers)){
    return $size;
        } elseif($file_headers[0] == "HTTP/1.1 302 Found"){
            if (isset($file_headers["Location"])) {
                $url = $file_headers["Location"][0];
                if (strpos($url, "/_as/") !== false) {
                    $url = substr($url, 0, strpos($url, "/_as/"));
                }
                $file_headers = @get_headers($url, 1);
                return getSize($file_headers);
            }
        }
        return false;
    }
    
    function getSize($file_headers){
    
        if (!$file_headers || $file_headers[0] == "HTTP/1.1 404 Not Found" || $file_headers[0] == "HTTP/1.0 404 Not Found") {
            return false;
        } elseif ($file_headers[0] == "HTTP/1.0 200 OK" || $file_headers[0] == "HTTP/1.1 200 OK") {
    
            $clen=(isset($file_headers['Content-Length']))?$file_headers['Content-Length']:false;
            $size = $clen;
            if($clen) {
                switch ($clen) {
                    case $clen < 1024:
                        $size = $clen . ' B';
                        break;
                    case $clen < 1048576:
                        $size = round($clen / 1024, 2) . ' KiB';
                        break;
                    case $clen < 1073741824:
                        $size = round($clen / 1048576, 2) . ' MiB';
                        break;
                    case $clen < 1099511627776:
                        $size = round($clen / 1073741824, 2) . ' GiB';
                        break;
                }
            }
            return $size;
    
        }
        return false;
    }
    

    用法:

    echo getRemoteFilesize('https://stackoverflow.com/questions/14679268/downloading-files-as-attachment-filesize-incorrect');
    

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多