我创建了一个初学者程序,通过浏览器强制将文件从unix框下载到windows,它没有抛出任何错误,但在浏览器上只显示空白页。
PHP版本 - 5.2.13
Apache的2.0
Unix Box-HP-UX 11.11(旧版本最新版本为11.31)
本地PC-windows XP教授
Browser-IE 7,Mozilla。
以下是我的代码(此代码位于unix框中):
<?php
ob_start();
$file = '/opt/hpws/apache/htdocs/barn/file2';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream;charset=utf-8');
header('Content-Disposition: attachment; filename=$file');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
答案 0 :(得分:1)
此行缺少引号:
header('Content-Disposition: attachment; filename=$file');
在尝试使用该行代码时,浏览器会提示将文件保存为$file
。
代码行应为:
header('Content-Disposition: attachment; filename="'.basename($file).'"');
以下(使用二进制文件测试)文件与执行代码在同一文件夹中。
注意:如果它是ASCII文件,您可以使用header("Content-Type: application/text");
。
<?php
ob_start();
$file = 'file.zip';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream;charset=utf-8');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
答案 1 :(得分:0)
好的,让我们添加一些检查和调试。
<?php
$file = '/opt/hpws/apache/htdocs/barn/file2';
if (!file_exists($file)) {
die("The file does not exist");
}
if (!is_file($file)) {
die("Not a file"); // Worry about symlinks later
}
if (!is_readable($file)) {
die("The file is not readable");
}
die("DEBUG: Okay, will send the file -- remove this line and retry");
$name = basename($file); // Or anything else
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"{$name}\"");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit();
?>
如果这不起作用,它应该至少告诉你原因。此外,在第一次运行时,它仍然不会下载文件,但只告诉您它将检查页面除了一行之外不包含任何其他内容。否则,你就是在堕落;如果不是这一次,只要您发送的文件大于输出缓冲区,或者系统内存的文件太多。