1

これまでのところ、app / filesディレクトリにファイルをアップロードし、非推奨のメディアビューを使用してダウンロードすることができました。使えない

    $file = $this->Attachment->getFile($id);

そして、ユーザーのプロフィール画像のように、画像/ファイルをユーザーに表示したいと思います。ユーザーイメージのセキュリティを損なうことなく、これを行うにはどうすればよいですか。

エラーが発生します

    Call to a member function getFile() on a non-object

同じプラグインを使いたくありません。

前もって感謝します。

4

2 に答える 2

1

3つのオプションがあります。

  1. Webルートの外部のディレクトリへのアクセスをURL経由で表示できるようにするmod_rewriteルールを作成します。このように、画像はPHPスクリプトを介して出力する必要はありません
  2. Webルートの外部のディレクトリを指すシンボリックリンクをWebルートの内部に作成します。このように、画像はPHPスクリプトを介さずに、Apacheによって直接出力されます。ここで「プラグインアセット」の手順に従うことができます:http://book.cakephp.org/2.0/en/plugins.html#plugin-assets
  3. PHPでファイルを読み取り、関数などを使用してPHPで画像(のサイズ変更バージョン)を出力しimagejpeg()ます。これを機能させるには、「レイアウト」を使用せずに画像を出力し、適切な応答ヘッダーを設定する必要があります。'response'オブジェクトの詳細については、http://book.cakephp.org/2.0/en/controllers/request-response.html#sending-filesを参照してください。

現時点では例を書く時間がありませんが、必要に応じていくつかのポインタを提供できます

アップデート

MediaViewはCakePHP2.3で非推奨になりましたが、ファイルのダウンロードを自分で処理する方法について、MediaViewから「学ぶ」ことができます。MediaViewの「魔法」のほとんどはResponse-objectに集中しています。これは、Cake内(コントローラー内でも)のほぼすべてのオブジェクトで使用できます。de MediaViewを、ファイルを出力/送信するためにコントローラーに接続できるコンポーネントに変換するのはおそらく簡単です。

MediaViewのソースはここにあります:http: //api.cakephp.org/2.2/source-class-MediaView.html#23-242

また、response-objectを介したファイルの送信に関する追加情報は、前述のリンク(http://book.cakephp.org/2.0/en/controllers/request-response.html#sending-files)にあります。

重要

あなたの質問とは直接関係ありませんが、いくつかの警告があります。

ユーザー提供のアップロードは危険です。必ずファイル名を確認し、ファイル名とパスをサニタイズしてください(ユーザーがパスを指定できる場合)。ユーザーがパス名として「../../../../」のようなものを送信できると常に想定して、その状況から身を守ってください

ユーザーがアップロードしたファイルを含むディレクトリ/URLのPHP解析を必ず無効にしてください。ユーザーがアップロードdangerous_file.php.jpgでき、後でファイルの名前を変更できる(remove .jpg)という状況を見てきました。

パスでPHPを無効にする方法の詳細については、次を参照してください。 ディレクトリ(すべてのサブディレクトリを含む)で.htaccessを使用してPHPを無効にする

そして、その最後の点に関して:ユーザーディレクトリ内のこれらの設定の「オーバーライド」を必ず無効にしてください(たとえば、ユーザーがファイルをアップロードできる状況を考えてみてください)。.htaccess

于 2013-03-01T07:55:22.727 に答える
0

メディアビューはcakephp2.3で非推奨になりました

このリンクを見てください:

http://book.cakephp.org/2.0/en/views/media-view.html

public function download() {
    $this->viewClass = 'Media';
    // Download app/outside_webroot_dir/example.zip
    $params = array(
        'id'        => 'example.zip',
        'name'      => 'example',
        'download'  => true,
        'extension' => 'zip',
        'path'      => APP . 'outside_webroot_dir' . DS
    );
    $this->set($params);
}
于 2013-03-01T07:26:47.943 に答える