Bri*_*eal 2 php csv storage save laravel
在这里找到了一些关于此的问题但没有答案,所以希望有人能指出我正确的方向......
我正在尝试创建一个 csv 文件并将其保存到存储中,然后在 Laravel 中更新数据库。我可以成功创建文件,并且可以成功更新数据库......但我坚持将它们放在一起。在我的控制器中,我有这个用于创建文件(取自此处):
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);
}
Run Code Online (Sandbox Code Playgroud)
函数完成后,最后一行(已注释掉)提示用户下载新创建的文件(这不是我正在寻找的功能)。我尝试将它添加到我的控制器中以保存到存储并更新数据库:
$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);
}
Run Code Online (Sandbox Code Playgroud)
它将一行保存到数据库中,尽管不正确,但它不会将文件保存到存储中。我已经$filePath将这条线重新设计了一百万次,但我不断收到这个错误Call to a member function storeAs() on resource或类似的错误。我对 Laravel 工作比较陌生,所以我不确定我应该寻找什么。想法?
删除所有内容并重新开始......明白了!对于遇到相同问题的任何其他人:只需调用一个不存在的文件即可创建该文件(除非该文件存在 - 然后它会更新它),因此您不必创建临时文件或用于$file = fopen('php://output', 'w');创建文件。它会自动将新生成的文件“保存”在您fclose()退出文件时指定的文件路径中。
我唯一要注意的是文件路径必须存在(文件不存在,但文件路径存在)。在我的例子中,文件路径已经存在,但如果您的路径不存在或者您不确定它是否存在,请检查它是否存在,然后将目录.
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');
}
Run Code Online (Sandbox Code Playgroud)
一切都在本地完美运行,当我将其推送到生产时,我收到此错误:
fopen(https://..../12-3456789.csv): failed to open stream: HTTP wrapper does not support writeable connections.
Run Code Online (Sandbox Code Playgroud)
我正在保存到一个 s3 存储桶,我不得不重新设计整个过程。您不能在目录中创建和/或写入文件。我必须先创建一个临时文件。这是我降落的地方:
$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');
Run Code Online (Sandbox Code Playgroud)