laravel - 如何在本地存储系统上存储文件

标签 laravel laravel-5

我正在尝试使用 Laravel Storage Facade 将文件上传到临时位置,但它说该文件不存在。我正在尝试将文件上传到 ./storage/app/roofing/projects/{id}/then 文件。不确定我到底错在哪里。

foreach ($files as $file) {
    $path = Storage::putFile('contract-assets', new File('../storage/app/roofing/projects/'. $project->id.'/'. $file));
}

我必须将文件存储在本地服务器上后发送到 AWS S3,因为尝试直接上传到 S3 需要时间,而在我的情况下,由于需要存储的文件数量,需要时间。到目前为止,我在 dd() 中得到的都是 true。可能是什么原因造成的?

if (!empty($request->contract_asset)) {
    $files = $request->file('contract_asset');
    foreach ($files as $file) {
        Storage::putFile(Carbon::now()->toDateString().'/roofing/projects/'. $project->id.'/contract-assets', $file);
    }
}

foreach (Storage::files(Carbon::now()->toDateString().'/roofing/projects/'.$project->id.'/contract-assets') as $file) {
    dispatch(new ProcessRoofingProjectContractAssets($file, $project));
}

我的工作文件。

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $path = Storage::disk('s3')->put('contract-assets', $this->asset, 'public');
    dd($path);
    $this->project->addContractAsset($path);    
}

更新:

这些是我当前的更改,我收到以下错误消息。 失败,因为无法对有效负载进行 JSON 编码。错误代码:5

foreach ($files as $file) {
    $returnedStoredFile = Storage::putFile('/roofing/projects/' . $project->id . '/contract-assets/'.Carbon::now()->toDateString(), $file);
    dispatch(new ProcessRoofingProjectContractAssets(Storage::get($returnedStoredFile), $project));
}

最佳答案

您不应该将整个文件作为参数传递给您的作业。 Laravel 会将其序列化,这会导致内存效率极低。 (您现在可能在序列化期间遇到此问题 - 失败,因为无法对 JSON 编码有效负载。错误代码:5)

我假设您在临时文件夹中上传没有问题,但在分派(dispatch)作业(或执行作业)时遇到问题。

编辑您的作业以接收文件路径作为参数。仅在作业执行期间,您才会访问磁盘并读取它。

调度作业:

foreach ($files as $file) {
    $returnedStoredFile = Storage::putFile('/roofing/projects/' . $project->id . '/contract-assets/'.Carbon::now()->toDateString(), $file);
    dispatch(new ProcessRoofingProjectContractAssets($returnedStoredFile, $project));
}

并执行它:

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $file = Storage::get($this->asset);
    $path = Storage::disk('s3')->put('contract-assets', $file, 'public');
    dd($path);
    $this->project->addContractAsset($path);    
}

关于laravel - 如何在本地存储系统上存储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48194429/

相关文章:

php - Lumen Model::find() 不选择主键

php - 调用 API 时出现 cURL 错误。 cURL 错误编号 :[60] SSL certificate prob: self signed certificate in certificate chain

laravel-5 - 如何在 Laravel 中创建自己的类助手?

php - 在 Laravel 上过滤

php - 我正在努力获取 api 的任何功能

javascript - Algolia Instantsearch 分页不显示第二页结果

apache - Laravel/XAMPP/Sendmail 不发送邮件

javascript - 如何在laravel中实现select2

php - laravel spatie日志包设置哪些字段被修改

php - Laravel 5 中的 "Call to a member function put() on null"