创建 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');