0

私はcakePHP2.xで簡単なアプリケーションを書いています。ユーザーがファイルをアップグレードしてダウンロードできるようにする必要があります。アップロードは正常に機能しますが、ダウンロードアクションでスタックします。

ダウンロードアクションを含むコントローラー名Documentsがあります。

public function download($id = null) {
    $this->Document->recursive = -1;
    $doc = $this->Document->find('first', array('conditions' => array('Document.id' => $id)));

    $filename = $doc['Document']['file_file_name'];

    $resp = new CakeResponse();
    $resp->download(Configure::read('upload_dir').'upload'.DS.$id.'_'.$filename);
    $resp->send();
}

はい、ファイルが存在するかどうかなどは確認していませんが、テスト用です。したがって、ダウンロードメソッドのパスは次のようになります。/home/www-app/upload/$id_$filename

もちろん、ファイルは存在し、両方のパスは同じです。

しかし、私はchromeから次のエラーを受け取りました:

Erreur 6 (net::ERR_FILE_NOT_FOUND) : File or Directory not found

$ resp-> file()メソッドを試しましたが、cakePHPはそのメソッドを知らないようです。

ありがとう!

4

1 に答える 1

2

Cake2.xとその応答クラスを、本来あるべき方法で(そしてそれがどのように文書化されているか!)操作していない。

新しいインスタンスを使用しないでください。使用する必要のあるインスタンスがすでにあります。

$this->autoRender = false;
$this->response->send();

また、autoRender falseを使用すると、ビューは必要ありません(ファイルを直接送信する場合はどうなりますか?)。

訂正2013-01-10: send()も必要ありません。autoRender部分自体で十分です。応答クラスは、ディスパッチングプロセスの最後にsend()を自動的に呼び出します。

$this->autoRender = false;
$this->response->file(Configure::read('upload_dir').'upload'.DS.$id.'_'.$filename);

// optionally force download as $name
$this->response->download($name);
于 2012-11-12T01:47:15.953 に答える