2

我有一个使用 Vapor 部署的 Laravel 应用程序 (v6.x)。

我正在尝试使用 Laravel Nova 中的表单上传文件。

Nova 提供了多种上传方式,一种使用他们自己的实现以方便使用,另一种是开发人员拥有更多控制权。

标准代码:

public function fields(Request $request)
    {
        return [
              File::make('file')
                ->disk('s3')
                ->storeSize('attachment_size')->nullable()
                ->path('ID-'.$request->associatedId)
                ->putFile()
                ->hideWhenUpdating()
                ->hideFromIndex(),
        ];
    }

和“控制”:

public function fields(Request $request)
    {
        return [
              File::make('file')
              ->store(function (Request $request, $model) {
                // I think i can do whatever i want here.

                  return [
                      'file' => $request->file->store('/ITEM-'.$request->associatedId, 's3'),
                      'attachment_size' => $request->file->getSize(),
                  ];
              }),
         ];
    }

只要文件约为 3MB 或更少,这两种方法都可以。但是,我需要上传大小约为 20~200 MB 的文件。

每当我尝试提交表单时,所有信息都会存储到数据库中,并且不会显示错误。遗憾的是,文件字段没有填写,也没有上传。

我需要做什么才能在 Laravel nova 中上传大文件?

4

1 回答 1

0

尝试VaporImage/VaporFile (Laravel\Nova\Fields\VaporImage) 而不是File/Image

这是我的代码:

return [
        ID::make()->sortable(),
        Text::make('Name')->sortable(),
        Text::make('Original Filename')->readonly()->exceptOnForms(),
        Text::make('Content Type')->readonly()->exceptOnForms(),
        Text::make('Size')->readonly()->exceptOnForms(),
        Text::make('path')->readonly()->onlyOnDetail(),
        DateTime::make('Approved At')->sortable()->exceptOnForms(),
        VaporImage::make('Path')
            ->path('/assets')
            ->storeOriginalName('original_filename')
            ->storeOriginalSize('size')
            ->storeOriginalMimeType('content_type'),
    ];

VaporImage 类中不存在storeOriginalSizestoreOriginalMimeType等函数,这就是我创建自己的 VaporImage 类并扩展 Laravel 的 VaporImage 的原因。

这是我自己的 VaporImage 类:

<?php

namespace App\Nova\Core;

use Illuminate\Support\Facades\Storage;
use Laravel\Nova\Fields\VaporImage as NovaVaporImage;

class VaporImage extends NovaVaporImage
{
 /**
  * The column where the file's original size should be stored.
  *
  * @var string
  */
 public $size;

 /**
  * The column where the file's original mimeType should be stored.
  *
  * @var string
  */
 public $mimeType;

 /**
  * Specify the column where the file's original size should be stored.
  *
  * @param  string  $column
  * @return $this
  */
 public function storeOriginalSize($column)
 {
     $this->size = $column;

     return $this;
 }

 /**
  * Specify the column where the file's original mimeType should be stored.
  *
  * @param  string  $column
  * @return $this
  */
 public function storeOriginalMimeType($column)
 {
     $this->mimeType = $column;

     return $this;
 }

 /**
  * Merge the specified extra file information columns into the storable attributes.
  *
  * @param  \Illuminate\Http\Request  $request
  * @param  array  $attributes
  * @return array
  */
 protected function mergeExtraStorageColumns($request, array $attributes)
 {
     if ($this->originalNameColumn) {
         $attributes[$this->originalNameColumn] = $request->input($this->attribute);
     }

     if ($this->size) {
         $attributes[$this->size] = Storage::size($request->input('vaporFile')['key']);
     }

     if ($this->mimeType) {
         $attributes[$this->mimeType] = Storage::mimeType($request->input('vaporFile')['key']);
     }

     return $attributes;
}
于 2020-08-11T08:11:31.023 回答