使用Laravel Nova

时间:2019-10-29 19:09:20

标签: laravel file-upload laravel-vapor

我有一个与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中的大文件上传成为可能?

1 个答案:

答案 0 :(得分: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'),
    ];

storeOriginalSize storeOriginalMimeType 之类的功能在VaporImage类中不存在,这就是为什么我创建了自己的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;
}