我正在尝试强制链接将文件作为附件下载。这是我以前做过的事情,但出了点问题,我不确定它是什么。我尝试作为附件发送的文件类型都是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个btyes。在调试时,我测试了文件大小是否正确,它是。我已将readfile()
行更改为:
header("location:/videos/$_GET[file]");
它带我去看视频。我已经做了很多谷歌搜索,我没有想出这个行为的理由。有没有人见过这种类型的东西?关于可能导致这种情况的任何想法?非常感谢任何帮助,非常感谢!
答案 0 :(得分:1)
如果您打开在文本编辑器中下载的文件的内容,毫无疑问会看到错误消息。这可能是因为您的路径以/
开头。从磁盘打开文件时,服务器路径的文档根目录无意义。您需要指定真实路径。
另外,你的剧本非常不安全!任何人都可以从服务器下载他们想要的任何文件。确保在提供文件之前检查文件是否在doc根目录中。 从不让用户只需指定他们想要的任何文件而不受限制。你不希望有人做?file=../../../etc/passwd
。
答案 1 :(得分:0)
使用这些功能,它可以帮助您。
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');