批量成功调用队列 laravel 中不允许返回语句。
在此代码中,首先我生成 csv 文件并将其存储在 public/csv 文件夹中,成功后,我尝试下载该文件,但我不能。在日志文件里面,有一条日志,我觉得return语句是不允许的。谁能帮我解决我的问题?
我的控制器调度电话:
$batch = Bus::batch([new ProcessReport,])->allowFailures()->onConnection('database')->onQueue('report')->then(function(\Illuminate\Bus\Batch $batch ) {\Log::info('Batch' . $batch->id . '成功完成!');$file_path = public_path() . DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'report.csv';$headers = [ 'Content-Type' => 'text/csv','Content-Disposition' => 'attachment; filename=report.csv',];\Log::info('File path' . $file_path);return Response: :download($file_path, 'report.csv', $headers);})->catch(函数 (Batch $batch,\Exception $e) {\Log::error("Error".$e->getMessage( ));})->finally(function(\Illuminate\Bus\Batch $batch) {\Log::info('清理 batch 中的剩余物' . $batch->id);})->dispatch();
您似乎在将文件存储在 Laravel 应用程序后尝试下载它。但是,由于您将此任务作为排队作业运行,因此无法返回响应。相反,您可以使用 Laravel 的文件系统来存储文件,然后通过单独的请求检索它。
这是一个如何使用 Laravel 的文件系统存储文件的示例:
use Illuminate\Support\Facades\Storage;
// Generate and store the file
$fileContents = "your csv file contents";
$fileName = "example.csv";
Storage::disk('public')->put('csv/'.$fileName, $fileContents);
此代码会将文件存储在应用程序的
public/csv
文件夹中。
要下载文件,您可以创建一个单独的路由,将文件内容作为响应返回:
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;
// Route for downloading the file
Route::get('/download-csv/{filename}', function ($filename) {
$path = 'csv/'.$filename;
$headers = [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="'.$filename.'"',
];
return new StreamedResponse(function () use ($path) {
$stream = Storage::disk('public')->readStream($path);
fpassthru($stream);
}, 200, $headers);
});
在这段代码中,我们正在创建一个接受文件名作为参数的路由。然后,代码使用
public/csv
外观从 Storage
文件夹中读取文件,并将其作为带有适当标头的流式响应返回。
然后,您可以在排队的作业完成下载文件后将用户重定向到此路由。