Laravel 5.8에서 Traits를 사용하여 CSV 파일 다운로드
목적:
보상 CSV 파일을 업로드 후 별도 경리에 전달하는 급여 명세서의 CSV 파일을 다운로드하는 처리를 구현
1. 루트 설정
Route::any('/csv/account/download/{ym}/{kind}', 'Csv\PaymentController@account')->where('ym', '[0-9]{4}-[0-1]{1}[0-9]{1}');
2. Controllers
namespace App\Http\Controllers\Csv;
use App\Http\Traits\Csv;
use App\Models\CsvFile;
use App\Http\Controllers\Controller;
/**
* Class PaymentController
* @package App\Http\Controllers\Csv
*/
class PaymentController extends Controller
{
use Csv;
/**
* CSVをダウンロード(経理用)
*
* @param $ym
* @param $kind
* @return mixed
*/
public function account($ym, $kind) {
// ファイル名
$filename = $ym.TF_CSV_ACCOUNT_FILE_NAME;
$file = Csv::createCsv($filename);
// ヘッダー
$header = TF_CSV_ACCOUNT_FILE_HEADER;
Csv::write($file, $header);
// リスト
$rentalList = $this->twPayment->getRentalList($kind, $ym);
foreach ($rentalList as $rental){
$data = [
$rental->user_id,
$rental->l_name. $rental->f_name,
$rental->bank_name,
$rental->branch_name,
$rental->branch_code,
$rental->account_number,
$rental->name_kana,
$total,
];
// 値を入れる
Csv::write($file, $data);
}
// ファイルコンテンツ取得
$response = file_get_contents($file);
// ストリームに入れたら実ファイルは削除
Csv::purge($filename);
return response($response, 200)
->header('Content-Type', 'text/csv')
->header('Content-Disposition', 'attachment; filename='.$filename);
}
}
3. Traits
namespace App\Http\Traits;
trait Csv {
/**
* CSVファイルを生成
*
* @param $filename
* @return mixed
*/
public static function createCsv($filename) {
$csv_file_path = storage_path('app/'.$filename);
$result = fopen($csv_file_path, 'w');
if ($result === FALSE) {
throw new Exception('CSVファイルの書き込みに失敗しました。');
} else {
fwrite($result, pack('C*',0xEF,0xBB,0xBF)); // BOM をつける
}
fclose($result);
return $csv_file_path;
}
/**
* CSVファイルに書き出す
* @param $filepath
* @param $records
*/
public static function write($filepath, $records) {
$result = fopen($filepath, 'a');
// ファイルに書き出し
fputcsv($result, $records);
fclose($result);
}
/**
* CSVファイルの削除
*
* @param $filename
* @return mixed
*/
public static function purge($filename) {
return unlink(storage_path('app/'.$filename));
}
}
4.BOM를 켜기
fwrite($result, pack('C*',0xEF,0xBB,0xBF));
BOM을 붙이는 것으로 UTF-8로 출력해도 Excel로 읽을 수 있게 된다.
Reference
이 문제에 관하여(Laravel 5.8에서 Traits를 사용하여 CSV 파일 다운로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kerry/items/ec46a137dec611809119텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)