2016-06-14 7 views
0

私は現在、Zend Frameworkを使用しているPHPプロジェクトに取り組んでいます。コントローラで問題なくCSVを作成していますが、ユーザーがビュー内のボタンをクリックしてファイルをダウンロードできるようにします。私が持っている私の.phtmlPHPプロジェクトのtmpフォルダからCSVをダウンロード

<a class="btn" href="<?php echo $this->download;?>" download>Export to CSV</a> 

$this->downloadは、コントローラに設定されている:

$view["download"] = $this->_createCSV($bqc_jobs, $startDate, $endDate, $processor_id, $defaultTime); 

_createCSV関数はCSVおよびサイトが使用する一時ディレクトリに保存し、それを作成します。次に、ファイルパスを返します。

private function _createCSV($jobs, $start, $end, $user=null, $minutes){ 
    $format = "Ymd_His"; 
    if(!$start && !$user){ 
     $start = date($format, strtoTime("-" . $minutes . " minutes")); 
    } 

    if(!$end){ 
     $end = \DateTime::createFromFormat($format, date($format))->format($format); 
    } 
    $directory = Config::$tempDir; 
    $fileName = $directory . "/" . ($user ? $user . "_" : "") . ($start ? $start . "_" : "") . $end . "_report.csv"; 

    $file = fopen($fileName, 'w'); 
    foreach ($jobs as $job){ 
     fputcsv($file, $job); 
    } 

    fclose($file); 

    return $fileName; 
} 

ボタンをクリックすると、ブラウザはファイルのダウンロードを試みますが、ファイルが見つからないためにエラーが発生します。ブラウザーは一時フォルダーにアクセスする必要がないので、これは理にかなっていますが、これを回避する方法は完全にはわかりません。

+2

私は最近、ファイルをストリーミングすることによってまったく同じことを達成しました - 私は素早くGoogleをやって、これを助けてくれるかもしれません(Zendに慣れていない)http://www.sasaprolic.com/2013/02/sending-stream- respond-with-zend.html – Djave

+0

@Djaveは有望ですね、ありがとうございます –

答えて

1

あなたが原因UNIXファイルのパーミッションにフォルダが表示されない場合は、あなたの唯一のオプションはになります:Webサーバーは、読み取り/書き込みができるように

  1. 変更tmpフォルダ上のファイルのパーミッションchmod/chownを使用しています(Linuxシステムと仮定しています)
  2. 十分な権限を持つ別のフォルダを使用してください。
  3. ファイルをディスクに保存しないでください。

あなたのファイルのパーミッションが順序になっていると、ファイルが実際にブラウザにファイルを送信するためにPHPのreadfile機能を使用するようにApache、it appears that you should be ableで読み取ることができることを確認したら:Laravelで

<?php 
$file = '/tmp/monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 
?> 
+1

私はそれがファイルのアクセス権の問題ではなく、 'tmp'ディレクトリがどこでもそのサイトでホストされています。 –

+0

あなたが探しているのは、一時ファイルを開いて、実際にWebサーバーの構成ファイルのWebサイトのスコープの一部ではなく、そのファイルを提供する方法です。どのWebサーバーを使用していますか? –

+0

はい、かなり。私はサーバー側のファイルにアクセスできますが、クライアント側でダウンロードできるようにしたいので、クライアント側に渡す方法を理解する必要があります。私はApacheを使用しています –

関連する問題