-1

重複の可能性:別のファイルの
php
強制ダウンロードでファイルのダウンロードを強制する

ユーザーが自分のサイトから PHP で画像をダウンロードできるようにしようとしています。私はそれに関する記事をたくさん見てきましたが、php ドキュメントからreadfileを使用しようとしていました。しかし、私はそれを機能させることができないようです。

これは、ダウンロードを開始するために設定しようとしているボタンのコードです。

        <!-- download image button  -->
    <form class="grid_12" style="text-align: center;" action="../includes/download.php" method="post">
        <input type="hidden" name="id" value="<?php echo $photo->id; ?>" />
        <input type="hidden" name="img" value="<?php echo $photo->filename; ?>" />
        <?php if(isset($_GET['cat'])){?>
            <input type="hidden" name="cat" value="<?php echo $_GET['cat']; ?>" />
        <?php } ?>  
        <div id="download"><input type="submit" name="submit" value="Download Photo" /></div>
    </form>

そして、これは私が download.php ファイルに設定したコードです (redirect_to は header(Location: var) を呼び出す関数であり、var はあなたが渡すものです。

<?php
require_once('initialize.php');
?>
 <?php
header("Content-type: application/force-download; filename=".$_POST['img']);

// Force download of image file specified in URL query string and which
// is in the same directory as this script:
if(!empty($_POST['img']))
{
   $file = $_POST['img'];
   if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        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));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }

   $addy = "../public/photo.php?id=".$_POST['id'];
   if(isset($_POST['cat'])){
        $addy .= "&cat=".$_POST['cat'];
   }
   redirect_to($addy);
}
header("HTTP/1.0 404 Not Found");
?> 

投稿で送信している隠し変数は、主に、ダウンロードの開始後にユーザーをダウンロード元のページに戻すためのリダイレクト用です。ローカル ホストで、ダウンロード ボタンをクリックしたページにリダイレクトされます。私のサーバーでは、download.php として登録されている空白のページに送信されます。空白のページが表示されるため、これは潜在的に出力バッファリングと関係があると思います。これは通常、header() 関数を呼び出す前に何らかの出力があったことを意味します。

ここで私が間違っていることについて誰かが私に洞察を与えることができれば、私は大いに感謝します、読んでくれてありがとう。

-アラン

4

1 に答える 1

0

洞察に感謝します、それはハクレとGBDが指摘したことの組み合わせだったと思います。ヘッダーを2回呼び出していました。これは、例を設定する方法を1つ設定したためです。次に、読み取りファイルにもphpドキュメントの例を使用しました...

次に、ファイル名のみを送信していたため、画像ファイルの絶対パスを修正する必要がありました。迅速なサポートに改めて感謝します。

**アップデート

これにより、ローカルホストではすべてが修正されましたが、サーバーでは、ダウンロードを開始する代わりに、ぎこちない記号でいっぱいのページに移動します...この問題を調べて、解決策が見つかったら再投稿します。

**修理

まず、サーバー上のphp.iniファイルにアクセスし、allow_url_fopen = Onを変更して、サーバーがreadfile、fopenなどのファイルメソッドを使用できるようにする必要がありました。次に、ファイルに出力バッファリングを追加する必要がありました。ヘッダー呼び出し。出力バッファリングなしで、呼び出し全体が設定される前に最初のバッファリングが呼び出されました。

すべての助けにもう一度感謝します、それは今私のローカルホストとサーバーで動作します。

于 2012-10-17T18:38:56.230 に答える