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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: