【问题标题】:How to store a file on the local storage system如何在本地存储系统上存储文件
【发布时间】:2018-01-24 04:06:35
【问题描述】:

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

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

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

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);    
}

更新:

这些是我当前的更改,我收到以下错误消息。 Failed because Unable to JSON encode payload. Error code: 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));
}

【问题讨论】:

  • Storage::disk('local')->put('file.txt', 'Contents');
  • 这些是大文件,所以应该使用 putFile。
  • ...但是您使用的磁盘是否正确?
  • 什么是$file?细绳?对象?
  • 合约资产只是项目内部的目录。我对此感到很困惑。

标签: laravel laravel-5


【解决方案1】:

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

我假设您在临时文件夹中上传没有问题,并且您在调度作业(或执行作业)时遇到问题。

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

派遣工作:

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);    
}

【讨论】:

  • 这是正确的。作业序列化传递给构造函数的参数。将完整的文件路径作为参数,然后在句柄方法中读取文件,如@Diogo 的示例所示。
猜你喜欢
  • 2012-06-05
  • 2022-11-25
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多