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