3

次の 2 つのことを行う単純なスクリプトを作成しようとしています。

  1. ファイルを提供し、その宛先を非表示にします
  2. ダウンロードカウンターあり

今、私はワードプレス環境でこれを行っていますが、この質問はワードプレスに完全に関連しているわけではないので、ここで質問することにしました.

基本的に、現在、私が設定している方法は、クリックすると が設定され、設定されている$_['GET']かどうかがチェックされるリンクがあります。設定されている場合、ダウンロード ファイルが提供されます。

リンク: <a href="http://localhost:8888/fresh/?dl_id=01">Click here!</a>'

$_['GET']コード: http://pastebin.com/93nD43gA

コードにはワードプレスの専門用語が少しありますが、基本的にはダウンロード カウント user_meta をチェックしており、それが > 0 の場合serveFile()は呼び出されます。

ここで私が抱えている主な問題は、リンクをクリックするとreadfile()、実際のファイルの内容がウィンドウに読み込まれる (文字化けしたテキスト) ことです。を追加するtarget=_blank<a>、新しいブラウザ ウィンドウが開き、コンテンツがウィンドウに読み込まれます。

このアプローチは、スタンドアロンの php ファイルとして実行していたとき、完全にうまく機能しているように見えました。私の主な問題は、それに関連する関数などを呼び出すことができるように、wordpress スペースを保持する必要があることです。

$_['GET']セルフ ページ、カスタム テンプレート (上記のペーストビンのコード) を含む別のページ、およびスタンドアロンの php ファイルの両方でを使用してみました。最初の 2 つのオプションは両方とも、ファイルをウィンドウにロードします。3 つ目は、 を含めてもワードプレスの機能を保持しませんblog-header.php

ファイルを強制的にダウンロードし、ウィンドウにロードしないようにする方法の正しい方向を誰かが教えてくれますか?

4

2 に答える 2

3

ファイルの種類が何であれ、適切なヘッダーを設定する必要があります。たとえば、readfile常に PDF を提供する場合は、次のようにする必要があります。

// disable browser caching -- the server may be doing this on its own
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header('Content-Type: application/pdf');
//forces a download
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename=filename.pdf');
readfile($file);

header空白を含め、リクエストでデータをまったく送信していない場合にのみ機能することに注意してください。

于 2012-09-27T20:31:25.387 に答える
-2

「文字化けした」テキストは必要なものですが、それ以外にmimeを設定する必要があります。これは、ヘッダーを設定するだけで実現できます。header("Content-Type: image/png");

ファイルのマイムが異なる場合(pdf、doc、pngなど)、finfo拡張子を調べる必要があります。それを使用すると、ファイルの完全で正しいmimeを取得できます

<?php
$finfo = new \finfo(FILEINFO_MIME);
$mime = $finfo->file('path/to/file', FILEINFO_MIME_TYPE);
header("Content-Type: $mime");

前述のように、ヘッダーは、出力への書き込みが行われていない場合にのみ設定できます(エコー、印刷などはありません。ここでは、出力バッファリングが役立ちます)。

于 2012-09-27T20:34:59.190 に答える