创建 csv 并将其保存到 Laravel 中的存储空间
Create and save csv to storage in Laravel
在这里发现了一些没有答案的问题,所以希望有人能指出我正确的方向...
我正在尝试创建一个 csv 文件并将其保存到存储中,然后在 Laravel 中更新数据库。我可以成功创建文件,也可以成功更新数据库……但我坚持将它们放在一起。在我的控制器中,我有这个用于创建文件 (taken from here):
public function updatePaymentConfirm(Request $request) {
$users = User::all();
$fileName = 'test.csv';
$headers = array(
"Content-type" => "text/csv",
"Content-Disposition" => "attachment; filename=$fileName",
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
);
$columns = array('First Name', 'Email');
$callback = function() use($users, $columns) {
$file = fopen('php://output', 'w');
fputcsv($file, $columns);
foreach ($users as $user) {
$row['First Name'] = $user->first_name;
$row['Email'] = $user->email;
fputcsv($file, array($row['First Name'], $row['Email']));
}
fclose($file);
};
// return response()->stream($callback, 200, $headers);
}
函数完成后,最后一行(已注释掉)提示用户下载新创建的文件(这不是我要找的功能)。我尝试将它添加到我的控制器中以保存到存储并更新数据库:
$fileModel = new UserDocument;
if($callback) {
$filePath = $callback->storeAs('uploads', $fileName, 'public');
$fileModel->name = $fileName;
$fileModel->file_path = '/storage/' . $filePath;
$fileModel->save();
return back()
->with('success','File has been uploaded.')
->with('file', $fileName);
}
它将一行保存到数据库中,尽管不正确,但它没有将文件保存到存储中。我已经将 $filePath
行修改了一百万次,但我一直收到此错误 Call to a member function storeAs() on resource
或类似的错误。我对使用 Laravel 比较陌生,所以我不确定我应该寻找什么。想法?
删除所有内容并重新开始...明白了!对于其他 运行 遇到相同问题的人:只需调用不存在的文件即可创建文件(除非文件存在 - 然后更新它),因此您不必创建临时文件或使用 $file = fopen('php://output', 'w');
创建文件。当您 fclose()
退出文件时,它会自动将新生成的文件“保存”在您指定的文件路径中。
我唯一要注意的是文件路径必须存在(文件不存在,但文件路径确实)。在我的例子中,文件路径已经存在,但如果你的不存在或者你不确定它是否存在,请检查它是否存在,然后 make the directory.
public function updatePaymentConfirm(Request $request) {
$user = Auth::user();
$path = storage_path('app/public/docs/user_docs/'.$user->id);
$fileName = $user->ein.'.csv';
$file = fopen($path.$fileName, 'w');
$columns = array('First Name', 'Email Address');
fputcsv($file, $columns);
$data = [
'First Name' => $user->first_name,
'Email Address' => $user->email,
];
fputcsv($file, $data);
fclose($file);
$symlink = 'public/docs/user_docs/'.$user->id.'/';
$fileModel = new UserDocument;
$fileModel->name = 'csv';
$fileModel->file_path = $symlink.$fileName;
$fileModel->save();
return redirect()->route('completed');
}
** 更新 **
一切都在本地完美运行,当我将其推送到生产环境时,我收到了这个错误:
fopen(https://..../12-3456789.csv): failed to open stream: HTTP wrapper does not support writeable connections.
我正在保存到 s3 存储桶,我不得不重新处理整个过程。您无法创建 and/or 写入目录中的文件。我必须先创建一个临时文件。这是我着陆的地方:
$user = Auth::user();
$s3 = Storage::disk('s3');
$storage = Storage::disk('s3')->url('/');
$path = 'public/docs/user_docs/'.$user->id.'/';
$csvFile = tmpfile();
$csvPath = stream_get_meta_data($csvFile)['uri'];
$fd = fopen($csvPath, 'w');
$columns = array('First Name', 'Email Address');
$data = array(
'First Name' => $user->first_name,
'Email Address' => $user->email,
);
fputcsv($fd, $columns);
fputcsv($fd, $data);
fclose($fd);
$s3->putFileAs('', $csvPath, $path.$user->ein.'.csv');
在这里发现了一些没有答案的问题,所以希望有人能指出我正确的方向...
我正在尝试创建一个 csv 文件并将其保存到存储中,然后在 Laravel 中更新数据库。我可以成功创建文件,也可以成功更新数据库……但我坚持将它们放在一起。在我的控制器中,我有这个用于创建文件 (taken from here):
public function updatePaymentConfirm(Request $request) {
$users = User::all();
$fileName = 'test.csv';
$headers = array(
"Content-type" => "text/csv",
"Content-Disposition" => "attachment; filename=$fileName",
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
);
$columns = array('First Name', 'Email');
$callback = function() use($users, $columns) {
$file = fopen('php://output', 'w');
fputcsv($file, $columns);
foreach ($users as $user) {
$row['First Name'] = $user->first_name;
$row['Email'] = $user->email;
fputcsv($file, array($row['First Name'], $row['Email']));
}
fclose($file);
};
// return response()->stream($callback, 200, $headers);
}
函数完成后,最后一行(已注释掉)提示用户下载新创建的文件(这不是我要找的功能)。我尝试将它添加到我的控制器中以保存到存储并更新数据库:
$fileModel = new UserDocument;
if($callback) {
$filePath = $callback->storeAs('uploads', $fileName, 'public');
$fileModel->name = $fileName;
$fileModel->file_path = '/storage/' . $filePath;
$fileModel->save();
return back()
->with('success','File has been uploaded.')
->with('file', $fileName);
}
它将一行保存到数据库中,尽管不正确,但它没有将文件保存到存储中。我已经将 $filePath
行修改了一百万次,但我一直收到此错误 Call to a member function storeAs() on resource
或类似的错误。我对使用 Laravel 比较陌生,所以我不确定我应该寻找什么。想法?
删除所有内容并重新开始...明白了!对于其他 运行 遇到相同问题的人:只需调用不存在的文件即可创建文件(除非文件存在 - 然后更新它),因此您不必创建临时文件或使用 $file = fopen('php://output', 'w');
创建文件。当您 fclose()
退出文件时,它会自动将新生成的文件“保存”在您指定的文件路径中。
我唯一要注意的是文件路径必须存在(文件不存在,但文件路径确实)。在我的例子中,文件路径已经存在,但如果你的不存在或者你不确定它是否存在,请检查它是否存在,然后 make the directory.
public function updatePaymentConfirm(Request $request) {
$user = Auth::user();
$path = storage_path('app/public/docs/user_docs/'.$user->id);
$fileName = $user->ein.'.csv';
$file = fopen($path.$fileName, 'w');
$columns = array('First Name', 'Email Address');
fputcsv($file, $columns);
$data = [
'First Name' => $user->first_name,
'Email Address' => $user->email,
];
fputcsv($file, $data);
fclose($file);
$symlink = 'public/docs/user_docs/'.$user->id.'/';
$fileModel = new UserDocument;
$fileModel->name = 'csv';
$fileModel->file_path = $symlink.$fileName;
$fileModel->save();
return redirect()->route('completed');
}
** 更新 **
一切都在本地完美运行,当我将其推送到生产环境时,我收到了这个错误:
fopen(https://..../12-3456789.csv): failed to open stream: HTTP wrapper does not support writeable connections.
我正在保存到 s3 存储桶,我不得不重新处理整个过程。您无法创建 and/or 写入目录中的文件。我必须先创建一个临时文件。这是我着陆的地方:
$user = Auth::user();
$s3 = Storage::disk('s3');
$storage = Storage::disk('s3')->url('/');
$path = 'public/docs/user_docs/'.$user->id.'/';
$csvFile = tmpfile();
$csvPath = stream_get_meta_data($csvFile)['uri'];
$fd = fopen($csvPath, 'w');
$columns = array('First Name', 'Email Address');
$data = array(
'First Name' => $user->first_name,
'Email Address' => $user->email,
);
fputcsv($fd, $columns);
fputcsv($fd, $data);
fclose($fd);
$s3->putFileAs('', $csvPath, $path.$user->ein.'.csv');