Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将文件下载为附件文件大小不正确_Php_Header_Force Download - Fatal编程技术网

Php 将文件下载为附件文件大小不正确

Php 将文件下载为附件文件大小不正确,php,header,force-download,Php,Header,Force Download,我正试图强制链接下载一个文件作为附件。这是我以前做过的事情,但有些地方出了问题,我不确定是什么。我试图作为附件发送的文件类型都是mp4文件。以下是我正在做的: <?php if(isset($_GET['file'])) { $file_path = dirname(__FILE__) . "/videos/$_GET[file]"; if(file_exists($file_path)) { $file_url = "/videos/$_GET[

我正试图强制链接下载一个文件作为附件。这是我以前做过的事情,但有些地方出了问题,我不确定是什么。我试图作为附件发送的文件类型都是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()
行更改为:
标题(“位置:/videos/$\u GET[file]”


它带我去看录像。我在谷歌上搜索了不少,但我还没有找到这种行为的原因。以前有人见过这种东西吗?你知道是什么导致了这一切吗?任何帮助都将不胜感激,谢谢

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


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

使用这些函数,它会帮助您

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;
}

啊!当我应该使用$file\u路径时,我正在使用$file\u url,不知道我怎么看不到这一点。对于记录,这是一个精简版本的我实际上在做什么,完整的一个有安全检查,但感谢你指出它。多谢!
echo getRemoteFilesize('https://stackoverflow.com/questions/14679268/downloading-files-as-attachment-filesize-incorrect');