无法在 laravel 9 中的队列作业的 then 函数中下载文件

问题描述 投票:0回答:1

批量成功调用队列 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 batch-file queue jobs
1个回答
1
投票

您似乎在将文件存储在 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
文件夹中读取文件,并将其作为带有适当标头的流式响应返回。

然后,您可以在排队的作业完成下载文件后将用户重定向到此路由。

© www.soinside.com 2019 - 2024. All rights reserved.