Header Ads Widget

Ticker

6/recent/ticker-posts

Cargue y analice CSV con Laravel MediaLibrary y SpreadsheetReader

 Ejemplo rápido de un código que tuve que escribir recientemente. La tarea es simple: cargue CSV y analícelo. También guarde ese archivo y el registro, qué usuario lo cargó. Vamos a ver.

Aquí está el código del método del controlador, lo explicaré poco a poco a continuación:

public function importProcess(UploadImportModelRequest $request)
{
    $originalFile   = $request->file('import_file');
    $import = Import::create([
        'filename' => $originalFile->getClientOriginalName(),
        'user_id' => auth()->id(),
    ]);

    $file = $import->addMediaFromRequest('import_file')
        ->toMediaCollection('imports');

    $filename = storage_path('app/' . $file->id . '/' . $file->file_name);
    $reader = new \SpreadsheetReader($filename);
    foreach ($reader as $row) {
        // Parsing the rows...
    }
}

Explicación 1. Solicitud de formulario de validación

¿Ve la clase UploadImportModelRequest en los parámetros? Simplemente nos ayuda a validar que el archivo está presente y, de hecho, es CSV o TXT.

app / Http / Requests / UploadImportModelRequest.php :

class UploadImportModelRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'import_file' => [
                'required',
                'file',
                'mimes:csv,txt'
            ],
        ];
    }
}

Lea más sobre las reglas de validación de archivos en este artículo .


Explicación 2. Cargar archivo con Laravel MediaLibrary

Este paquete es probablemente el más popular para cargar archivos en Laravel, y esta es la razón: puede hacer muchas cosas en unas pocas líneas de código.

Pero primero, necesitamos almacenar el registro de importación que realmente ocurrió y obtener el objeto de modelo Eloquent para ello:

$originalFile   = $request->file('import_file');
$import = Import::create([
    'filename' => $originalFile->getClientOriginalName(),
    'user_id' => auth()->id(),
]);

Así que almacenamos el nombre del archivo original , cualquiera que sea, como "dummy import test.csv" o algo así. Pronto les mostraré por qué ese "original" es importante.

El resultado de esa consulta Eloquent es $ import object, y ahí es donde Laravel MediaLibrary es útil: en una línea de código podemos almacenar el archivo en una carpeta y también asignar ese archivo a ese $ import object:

$file = $import->addMediaFromRequest('import_file')
    ->toMediaCollection('imports');

El resultado de esto es:

  • Nuevo registro de base de datos almacenado en la tabla "media" con nombre de archivo y relación con ese objeto $ import ;
  • Una carpeta creada en la carpeta de almacenamiento / aplicación , con la identificación de ese registro de "medios";
  • Dentro de esa nueva carpeta, se almacena el archivo de carga;
  • Ese objeto de registro "multimedia" se devuelve a $ file .

Explicación 3. Obtener un nombre de archivo REAL y analizar CSV

Lo importante es que Laravel MediaLibrary en realidad cambia el nombre del archivo para hacerlo "sluggable", por lo que el nombre del archivo real es diferente del original. Vea la diferencia en el nombre del archivo y regístrelo en la tabla DB "media":

Es por eso que necesitamos leer el archivo CSV con su nuevo nombre de archivo, que se almacena dentro de ese objeto $ file .

$filename = storage_path('app/' . $file->id . '/' . $file->file_name);
$reader = new \SpreadsheetReader($filename);
foreach ($reader as $row) {
    // Parsing the rows...
}

Como puede ver, ahora nos referimos al archivo como almacenamiento / [media.id] / [media.file_name] .

En este ejemplo, no mostraré el análisis de CSV en detalle, ya que es muy individual, pero recomiendo usar un paquete de Spreadsheet Reader ; es bastante antiguo, pero por alguna razón funciona mucho más rápido que Laravel Excel u otros.

Publicar un comentario

0 Comentarios