Laravel 中使用 MediaLibrary 来处理上传的 CSV 文件

这是我最近写的一段简单的代码. 目标很简单 - 上传CSV文件并解析它. 并且要保存上传的文件然后记录是哪个用户上传的.
以下代码是在 Controller 里的方法, 我随后将一点点的解释这段代码:

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 .preadsheetReader($filename);
    foreach ($reader as $row) {
        // Parsing the rows...
    }
}

说明1. 验证FormRequest

请参阅参数中的类 UploadImportModelRequest 它只是帮助我们验证文件是否存在 并且验证文件是否为 CSV或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'
            ],
        ];
    }
}

说明2.使用Laravel MediaLibrary上传文件

此包 能是Laravel中最流行的文件上传包,原因就是-你可以用简单的几行代码来实现很多事情。

但是首先,我们需要把上传的文件信息储存起来,并为其获取它的Eloquent模型对象:

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

在这里我们保存文件的是文件的 原文件名 , 一会我将告诉你为什 原始文件名 会有什么变化

上面的 Eloquent query 返回的是一个 $import 对象, 这时候就是 Laravel MediaLibrary 派上用场的地方了 --- 只需要一行代码, 我们可以实现把文件存入一个文件夹, 然后把这个储存好的文件返回给 $import 对象

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

这行代码的结果是:

  • 数据库里 "media" 表新的记录, 包含了文件名和与该 $import 对象的关系;

  • storage/app 里生成一个新的文件夹, 文件夹名字是 “media” 新记录的ID

  • 在新文件夹里 - 储存上传文件;

  • “media” 记录的对象将被返回给  $file


说明3.获取 真实的 文件名并解析CSV

一个很重要的事情是, Laravel MediaLibrary 会重命名上传的文件, 所以最终储存的文件名和 原文件名 是不一样的. 你可以比较 原文件名 与 “media” 数据表中的 真实文件名 的记录:

这就是为什么我们得用 上传后的 真实文件名 读取 CSV的文件, 这个文件名储存在 $file 对象里.

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

如上, 你可以看到我们现在的文件路径现在指向
 storage/[media.id]/[media.file_name] .

本文我不会展示CSV解析的详细内容, 因为它非常独立, 但是我建议使用 Spreadsheet Reader package – 它比较老了, 但是它比 Laravel Excel 或其他包要快上很多.

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laraveldaily.com/upload-and-pars...

译文地址:https://learnku.com/laravel/t/38952

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!