Как прочитать буфер файла CSV и преобразовать его в JSON в Laravel (PHP)?

#php #json #laravel #csv

#php #json #laravel #csv

Вопрос:

У меня есть следующий код, который загружает файл .csv. Это работает нормально.

 public function csv(Export $export)
{

    $buffer = $export->getCsvData_();

    return response()->streamDownload(
        function () use ($buffer) {
            $file = fopen('php://output', 'w');
            fputs($file, $buffer);
            fclose($file);
        },
        "$export->filename.$export->file_extension",
        [
            "Content-type" => "text/csv",
            "Content-Disposition" => "attachment; filename=$export->filename.$export->file_extension",
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        ]
    );
}
  

Мне нужно прочитать этот буфер .csv и преобразовать файл CSV в файл JSON и загрузить его как файл JSON. Итак, прежде всего, я попытался преобразовать .csv в объект JSON следующим образом:

 public function json(Export $export)
{

    $buffer = $export->getCsvData_();

    $file = response()->streamDownload(
        function () use ($buffer) {
            $file = fopen('php://output', 'w');
            fputs($file, $buffer);
            fclose($file);
        },
        "$export->filename.csv",
        [
            "Content-type" => "text/csv",
            "Content-Disposition" => "attachment; filename=$export->filename.csv",
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        ]
    );
    $csv = file_get_contents($file);
    print_r($file);
    $array = array_map("str_getcsv", explode("n", $csv));
    $json = json_encode($array);
    print_r($json);
}
  

Я переношу CSV в $file и использую file_get_content и другие функции PHP. Но ‘print_r($json);’ дает мне нулевое значение.

Как это исправить? Есть ли лучший способ загрузить сгенерированный CSV в формате JSON?

Заранее благодарю вас.

Ответ №1:

Давайте попробуем

 public function json(Export $export)
    {
    
        $buffer = $export->getCsvData_();
    
        $file = response()->streamDownload(
            function () use ($buffer) {
                $file = fopen('php://output', 'w');
                fputs($file, $buffer);
                fclose($file);
            },
            "$export->filename.csv",
            [
                "Content-type" => "text/csv",
                "Content-Disposition" => "attachment; filename=$export->filename.csv",
                "Pragma" => "no-cache",
                "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
                "Expires" => "0"
            ]
        );
        //$file is the csv file URL
        $CSV_Data_Array = [];
        $file_handle = fopen($file, 'r');
        while (!feof($file_handle) ) {
           $CSV_Data_Array[] = fgetcsv($file_handle);
        }
        fclose($file_handle);
        //$csv = file_get_contents($file);
        print_r($CSV_Data_Array);
        //$array = array_map("str_getcsv", explode("n", $csv));
        $json = json_encode($array);
        print_r($json);
    }