laravl5.1のeloquentのモデルで、欲しいカラムを変数で指定する方法。
laravelで、ファイルのダウンロードをしようとhrefタグで指定すると
1, 日本語ファイルだとダメ
2, IEだと、ダウンロードダイアログが表示されない。
そのために、専用のメソッドを追加してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public function file_download($id, $kind) { $product = Product::findOrFail($id); // 商品画像ファイル if($kind === 'product_image_filename'){ $filename = $product->product_image_filename; $download_path = sprintf("%s/images/product/%s/%s/%s", public_path(), $product->id , $kind , $filename); // 注文書ファイル }elseif($kind === 'order_filename'){ $filename = $product->order_filename; $download_path = sprintf("%s/images/product/%s/%s/%s", public_path(), $product->id , $kind , $filename); //参考画像ファイル }elseif($kind === 'other_filename'){ // 以下略 } // レスポンスヘッダで、ファイル名やMIMEを指定する! $headers = array( 'Content-Type' => "application/octet-stream", 'Content-Disposition' => 'attachment; filename="' . $filename . '"' ); return \Response::download($download_path, $filename, $headers ); } |
ただ、これだと、ファイルの種類が増えるとif文が増えて見づらい。
問題は、帰ってきたモデル・オブジェクトのプロパティへのアクセスがアロー演算子にしているので、変数で指定できないかと探してみたら、getAttribute(‘カラム名’)で取得できた!
これで、かなりスッキリした!
ちなみに、存在しないカラム名を指定してもエラーにはならず、空文字が取得されるみたい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function file_download($id, $column_name) { // 指定されたカラム名から、ファイル名を取得する $product = Product::findOrFail($id); $filename = $product->getAttribute($column_name); $download_path = sprintf("%s/images/product/%s/%s/%s", public_path(), $product->id , $column_name , $filename); // レスポンスヘッダで、ファイル名やMIMEを指定する! $headers = array( 'Content-Type' => "application/octet-stream", 'Content-Disposition' => 'attachment; filename="' . $filename . '"' ); return \Response::download($download_path, $filename, $headers ); } |