0

I'm having trouble modifying my PHP program. Originally, the program would download a particular file from a Unix box, which worked fine. Now I've modified it a little so the user can enter a file name to download.

Now it's not working, and I'm not sure why. It doesn't throw any errors that I can see; the page simply returns blank.

PHP version - 5.2.13
Apache - 2.0
Unix Box - HP-UX 11.11 (old version; latest is 11.31)
local PC - Windows XP Pro
Browser - IE 7, Mozilla

Code:

       <html>

      <body>


      <?php

      ob_start();
      if(isset($_POST['name']))

       {

       $file = $_POST['name'];
      echo "file is  $file" ;
     if(!file_exists($file))

       {

     die("file not found: " );

     }


       $name = basename($file);
            header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename="'.$name.'"');

          header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
           header('Cache-Control: must-revalidate');
          header('Pragma: public');
            header('Content-Length: ' . filesize($file));
             ob_clean();
         readfile($file);
            exit;

             }

           else

              {
             echo " <form action='download1.php' method='post' enctype='multipart/form-data'>


       <b> Enter the file name: </b><input type='text' name='name'>
        <br> <br>
        <button type='submit'> Upload </button>

     </form>";
          }
      ?>
         </body>

         </html>

What am I doing wrong?

4

5 に答える 5

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-09T09:17:25.360 に答える
0

私はそれを解決しました.コードからタグを削除しただけで正常に動作しました.出力がバッファリングされていて、ブラウザに送信されなかったか、バッファから出て表示または機能することができなかったようです. .お時間をいただきありがとうございます...

于 2013-09-10T14:01:12.390 に答える
0

Vlad が言うように、ヘッダーを調整する前にコンテンツを出力しているため、コードがエラーをスローしているため、最初のタスクは、スローされているエラーを確認できないという問題を解決することです。

コードはファイルが存在するかどうかをチェックしますが、読み取り可能かどうかはチェックしません。

次の問題は、読み取り可能なコンテンツが見つかったとしても、HTML タグ内に埋め込まれたコンテンツを返すことです。

于 2013-09-09T08:17:14.710 に答える
0

編集

これを 1 つのファイルとして実行し、これを実行するにaction='' は、次のことを試してください。

<?php
ob_start();
if(isset($_POST['name'])) {

$file = $_POST['name'];
echo "file is  $file" ;
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("Content-Type: application/text");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

ob_clean();

readfile($file);
exit;
}
}

/*
if (!file_exists($file)) { 

echo "<br>";
echo "$file does not exist.";
}
*/
?>

<form action='' method='post'>
<b> Enter the file name: </b><input type='text' name='name'>
<br> <br>
<button type='submit'> Upload </button>
</form>

元の答え

2 つの別個のファイルを使用して、代わりにこの方法を試してください。(テスト済み)

注:ファイルは、実行されたコードと同じフォルダー内に存在する必要があり、正確なファイル名である必要があります。

つまり File.zip、 andfile.zipは、最初のファイル名が大文字で始まるため、2 つの異なるファイル名として扱われます。

HTMLフォーム

<form action='download_file.php' method='post'>
<b> Enter the file name: </b><input type='text' name='name'>
<br> <br>
<button type='submit'> Upload </button>
</form>

注: enctype='multipart/form-data'は必要ありません。

PHP ハンドラ (download_file.php)

<?php
ob_start();
if(isset($_POST['name'])) {

$file = $_POST['name'];
echo "file is  $file" ;
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("Content-Type: application/text");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

ob_clean();

readfile($file);
exit;
}
}

if (!file_exists($file)) { 

echo "<br>";
echo "$file does not exist.";
}
?>
于 2013-09-09T15:37:00.477 に答える