在unix框上使用php下载文件程序

时间:2013-09-07 19:41:03

标签: php unix

我创建了一个初学者程序,通过浏览器强制将文件从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;
    }
?>

2 个答案:

答案 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();
?>

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