PHP下载仅适用于包含文本的文件

PHP下载仅适用于包含文本的文件,php,file,file-io,download,Php,File,File Io,Download,我希望能够用php从我的服务器下载文件。到目前为止,它工作得很好,但只适用于包含文本的文件(.txt.php),所以包含简单文本的文件(即使有一个有趣的现象,在文本开始之前总是有一行空行…为什么呢?),但当我尝试下载.jpg文件或.exe时,它根本不起作用(尝试打开时出错…) 以下是我使用的代码: <?php session_start(); $file = basename($_GET['file']); $path = 'uploads/'.$_SESSION['userid']

我希望能够用php从我的服务器下载文件。到目前为止,它工作得很好,但只适用于包含文本的文件(
.txt
.php
),所以包含简单文本的文件(即使有一个有趣的现象,在文本开始之前总是有一行空行…为什么呢?),但当我尝试下载
.jpg
文件或
.exe
时,它根本不起作用(尝试打开时出错…)

以下是我使用的代码:

<?php

session_start();

$file = basename($_GET['file']);

$path = 'uploads/'.$_SESSION['userid']."/".$file;
?>

<?php
if(!file_exists($path)){
    die("file not found");
} else {
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename="'.$file.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($path);
    exit;
}

问题解决了

现在,我将脚本更改为手动响应不同类型的文件,如下所示:

<?php

session_start();

$filename = basename($_GET['file']);
$filename = 'uploads/'.$_SESSION['userid']."/".$filename;

$file_extension = strtolower(substr(strrchr($filename,"."),1));

switch ($file_extension) {
    case "pdf": $ctype="application/pdf"; break;
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpe": case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    default: $ctype="application/force-download";
}

if (!file_exists($filename)) {
    die("NO FILE HERE");
}

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($filename));
set_time_limit(0);
@readfile("$filename") or die("File not found.");
问题已解决

现在,我将脚本更改为手动响应不同类型的文件,如下所示:

<?php

session_start();

$filename = basename($_GET['file']);
$filename = 'uploads/'.$_SESSION['userid']."/".$filename;

$file_extension = strtolower(substr(strrchr($filename,"."),1));

switch ($file_extension) {
    case "pdf": $ctype="application/pdf"; break;
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpe": case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    default: $ctype="application/force-download";
}

if (!file_exists($filename)) {
    die("NO FILE HERE");
}

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($filename));
set_time_limit(0);
@readfile("$filename") or die("File not found.");

文件中有空行的原因只是因为代码中有空行

...
$path = 'uploads/'.$_SESSION['userid']."/".$file;
?>
                       <--- There's the empty line.
<?php
if(!file_exists($path)){
    die("file not found");
...
。。。
$path='uploads/'.$\u会话['userid'].“/”$file;
?>

文件中有空行的原因只是因为代码中有空行

...
$path = 'uploads/'.$_SESSION['userid']."/".$file;
?>
                       <--- There's the empty line.
<?php
if(!file_exists($path)){
    die("file not found");
...
。。。
$path='uploads/'.$\u会话['userid'].“/”$file;
?>

如何调用此脚本?我认为您的服务器为php和txt文件按mime类型设置头。它是另一个php文件中的链接,如:
echo“\n”
如何调用此脚本?我认为您的服务器为php和txt文件按mime类型设置头。它是另一个php文件中的链接,如:
echo”\n“
”;
太棒了,这真的很管用……但是你能解释一下为什么吗?为什么代码与我所访问的文件的内容有关download@user5638730基本上,PHP只处理
标记内的内容。这些标记外的任何内容都将被写出(就像您对其进行了
echo
处理一样)并成为正在下载的文件的一部分。当标记之间有空格时,这与文本或HTML时一样适用。因此,如果我在两行之间写“hello”(您的注释所在的位置),我可以在我的文本文件中读到hello?@user5638730是的,没错。有趣的是,以前从来没有想过,也许下载东西的时候它就那么显眼。令人惊讶的是,这真的很有效……但是你能解释一下为什么?为什么代码与我看到的文件内容有关download@user5638730基本上PHP只处理
标记内的空白。这些标记外的任何内容都将被写出来(就像您对其进行了
回送一样),并成为下载文件的一部分。当标记之间有空格时,这与当您有文本或HTML时一样适用。因此,如果我要在两行之间写“hello”(您的注释所在的位置),我可以在我的文本文件中读到hello?@user5638730是的,没错。有趣的是,以前从没想过,也许下载东西的时候它就那么显眼。