PHP下载仅适用于包含文本的文件
我希望能够用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']
.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是的,没错。有趣的是,以前从没想过,也许下载东西的时候它就那么显眼。