【发布时间】:2018-09-14 04:05:29
【问题描述】:
我用 PHP 编写了一个文件下载脚本,它使用户能够从我的服务器下载任何指定的文件。该脚本适用于 .txt、.pdf 和 .jpg 等文件。
但当用户尝试下载任何 .mp3 或 .mp4 文件时,虽然脚本会下载文件,但文件无法使用。与我的原始文件相比,该文件的大小要小得多。该文件无法在任何媒体播放器中打开 - 它已损坏。
我不知道我的这个下载脚本有什么问题。完整代码如下:
界面页面(index.php):
<a href="download.php?file=tutorial.pdf">Download Tutorial (pdf)</a><br /><br />
<a href="download.php?file=music.mp3">Download Music (mp3)</a><br /><br />
<a href="download.php?file=video.mp4">Download Video (mp4)</a>
PHP 脚本(下载.php):
<?php
if(isset($_GET['file']) && !empty($_GET['file']))
{
$file = $_GET['file'];
$file_without_spaces = str_replace(' ', "%20", $file);
$path_parts = pathinfo($file);
$file_name = $path_parts['basename'];
$file_path = "files/" . $file_name;
$file_extension = $path_parts['extension'];
if(!is_readable($file_path))
{
die("File not found!");
}
// Figure out the correct MIME type
$mime_types = array(
// Documents
"pdf" => "application/pdf",
"doc" => "application/msword",
"xls" => "application/vnd.ms-excel",
"ppt" => "application/vnd.ms-powerpoint",
"csv" => "application/csv",
"txt" => "text/plain",
// Archives
"zip" => "application/zip",
// Executables
"exe" => "application/octet-stream",
// Images
"jpg" => "image/jpeg",
"jpeg" => "image/jpeg",
"png" => "image/png",
"gif" => "image/gif",
"bmp" => "image/bmp",
// Audio
"mp3" => "audio/mpeg",
"wav" => "audio/x-wav",
// Video
"mpeg" => "video/mpeg",
"mpg" => "video/mpeg",
"mov" => "video/quicktime",
"avi" => "video/x-msvideo",
"mp4" => "video/mp4",
"3gp" => "video/3gpp"
);
if(array_key_exists($file_extension, $mime_types))
{
$mime_type = $mime_types[$file_extension];
}
header("Content-type: " . $mime_type);
header("Content-Disposition: attachment; filename=\"$file_without_spaces\"");
readfile($file_path);
}
?>
我下载了一个大小约为 250 MB 的 .mp4 大文件。结果只有 2 KB。我在记事本中发现了这个错误:
致命错误:允许的内存大小...
【问题讨论】:
-
试着用文本编辑器打开它
-
对 mp4 和 mp3 文件使用特定的标题内容类型...如下所示 header("Content-Type: video/mp4"); header("内容长度:".filesize("path/to/mp4")); readfile("路径/到/mp4"); header("内容类型:音频/mp3"); header("内容长度:".filesize("path/to/mp3")); readfile("path/to/mp3");
-
你设置内容长度了吗????
-
各位,我解决了!
-
@user5307298 你能在下面的答案栏中写下你如何解决它吗?没有什么比寻找问题的解决方案更糟糕的了
标签: php