如何使用带弹出标题的php下载文件(text / pdf / etc),以便用户选择保存或打开?该文件存储在(admin /)
中我正在使用它,但它不起作用。下载的文件为空! 这是我的代码:
//get the filename
$filename = $_GET['filename'];
//open the file based in filename and path
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");
header("Content-type: text/pdf");
header("Content-Disposition: attachment; filename=file.txt");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
//echo file_get_contents($filename);
exit;
答案 0 :(得分:3)
//echo file_get_contents($filename);
这真的应该被注释掉吗?
<强>编辑:强>
并使用readfile
您可以看到ANYTHING的原因是因为您在标题声明后没有显示ANYTHING。
答案 1 :(得分:1)
尝试
header("Content-type: application/octet-stream");
答案 2 :(得分:1)
这听起来像是你正在尝试的危险事情。为什么您希望用户能够下载任何文件?您确定不希望他们只能下载某个目录中的文件吗?使用您的脚本,他们可以访问您的所有PHP脚本,并可能在服务器中找到安全漏洞。
此外,使用注释掉的行,您可以考虑使用内存不足的解决方案替换它
while ($fp !== false && ($file_contents_buffer = fgets($fp, 10000)) !== false) {
echo $file_contents_buffer;
}
答案 3 :(得分:0)
一些问题:
$filename = $_GET['filename'];
$fp = fopen('admin/'.$filename, 'w') or die("can't open file");
如果我使用/page.php?filename=../../../../list_of_secret_passwords
该怎么办?这称为directory traversal attack,您需要防范。此外,您不需要打开文件句柄(写访问不少),只需使用file_exists
或is_readable
来检查文件是否存在。
//echo file_get_contents($filename);
如果此行被注释掉,当然不会发生任何事情。您首先应该使用readfile
。 file_get_contents
会将整个文件读入内存,然后echo
就像常规字符串一样。这非常浪费,可能会使大型文件的脚本崩溃。 readfile
将文件直接输出到用户输出,几乎不使用额外的内存。
这可能是你真正的问题:
/* $fp = fopen( */ 'admin/'.$filename /* , 'w') or die("can't open file"); */
/* echo file_get_contents( */ $filename /* ); */
'admin/'.$filename
与$filename
是哪一个?
答案 4 :(得分:0)
我认为此代码可以解决您的问题。
<?php
$allowed_files = array('filename1.pdf', 'filename2.pdf'); //list content allowed files
$file = $_GET["file"];
if(in_array($file , $allowed_files)) {
header("Content-type: text/pdf");
header("Content-Disposition: attachment; filename=file.txt");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
readfile($file);
exit;
}
else die('you do not have permission to download this file');
?>