1

我创建了一个初学者程序,通过浏览器将文件从 unix box 强制下载到 windows,它没有抛出任何错误,但在浏览器上什么也不显示,只是一个空白页。

PHP版本- 5.2.13
Apache-2.0
Unix Box- HP-UX 11.11(旧版本最新是11.31)
本地PC- windows XP Prof.
Browser- IE 7,Mozilla。

以下是我的代码(此代码位于 unix box 上):

<?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;
    }
?>
4

2 回答 2

1

此行缺少引号:

header('Content-Disposition: attachment; filename=$file');

并且在尝试使用该行代码时,浏览器会提示将文件另存为$file.

该行代码应如下所示:

header('Content-Disposition: attachment; filename="'.basename($file).'"');

以下(使用二进制文件测试)与执行代码位于同一文件夹中的文件。

注意header("Content-Type: application/text");:如果它是 ASCII 文件,您可以使用。

<?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;
    }
?>
于 2013-09-07T19:59:54.137 回答
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();
?>

如果这不起作用,它至少应该告诉你原因。此外,在第一次运行时,它仍然不会下载文件,但只会告诉你它会,检查页面是否包含除一行之外的任何其他内容。否则,你就是在为跌倒做好准备;如果不是这一次,一旦您必须发送大于输出缓冲区的文件,或者系统内存过多的文件。

于 2013-09-07T20:34:40.553 回答