添加分片上传方法

mall
vine_liutk 2023-12-30 13:46:24 +08:00
parent 2872d54f6f
commit 70fbbf1198
5 changed files with 99 additions and 3 deletions

View File

@ -100,6 +100,17 @@ class Components extends BaseRenderer {
->accept($accept); ->accept($accept);
} }
public function chunkFileControl($name, $label, $accept = '*', $multiple = false){
return amis()->FileControl($name, $label ?? __('admin.components.files'))
->multiple($multiple)
->joinValues(false)
->useChunk(true)
->accept($accept)
->startChunkApi(admin_url('start_chunk_upload_file'))
->chunkApi(admin_url('save_chunk_upload_file'))
->finishChunkApi(admin_url('finish_chunk_upload_file'));
}
/** /**
* 标签选择 * 标签选择
*/ */

View File

@ -90,7 +90,7 @@ class ArticleController extends AdminController
amis()->DateTimeControl('published_at', __('admin.articles.published_at'))->format('YYYY-MM-DD HH:mm:ss')->description(__('admin.articles.published_at_remark')), amis()->DateTimeControl('published_at', __('admin.articles.published_at'))->format('YYYY-MM-DD HH:mm:ss')->description(__('admin.articles.published_at_remark')),
amis()->SwitchControl('is_enable', __('admin.articles.is_enable'))->value(false), amis()->SwitchControl('is_enable', __('admin.articles.is_enable'))->value(false),
amis()->SwitchControl('is_recommend', __('admin.articles.is_recommend'))->value(false), amis()->SwitchControl('is_recommend', __('admin.articles.is_recommend'))->value(false),
Components::make()->fileControl('appendixes', __('admin.articles.appendixes'), '.xsl,.xlsx,.txt,.doc,.docx,.pdf,.pptx', true), Components::make()->chunkFileControl('appendixes', __('admin.articles.appendixes'), '.xsl,.xlsx,.txt,.doc,.docx,.pdf,.pptx'),
])->md(4), ])->md(4),
amis()->Wrapper()->body([ amis()->Wrapper()->body([
Components::make()->fuEditorControl('content', __('admin.articles.content')), Components::make()->fuEditorControl('content', __('admin.articles.content')),

View File

@ -36,4 +36,8 @@ Route::group([
$router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']); $router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']);
$router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']); $router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']);
$router->post('upload_rich', [\App\Admin\Controllers\IndexController::class, 'uploadRich']); $router->post('upload_rich', [\App\Admin\Controllers\IndexController::class, 'uploadRich']);
$router->post('start_chunk_upload_file', [\App\Admin\Controllers\IndexController::class, 'startChunk']);
$router->post('save_chunk_upload_file', [\App\Admin\Controllers\IndexController::class, 'saveChunk']);
$router->post('finish_chunk_upload_file', [\App\Admin\Controllers\IndexController::class, 'finishChunk']);
}); });

View File

@ -2,6 +2,7 @@
namespace App\Models\Filters; namespace App\Models\Filters;
use Illuminate\Support\Arr;
use EloquentFilter\ModelFilter; use EloquentFilter\ModelFilter;
class AdFilter extends ModelFilter class AdFilter extends ModelFilter

View File

@ -3,6 +3,7 @@
namespace App\Traits; namespace App\Traits;
use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Admin;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
trait UploadTrait trait UploadTrait
@ -49,7 +50,7 @@ trait UploadTrait
} }
/** /**
* 存放临时文件目录 * 存放临时文件目录,按日期区分
*/ */
protected function upload($type = 'file') protected function upload($type = 'file')
{ {
@ -59,7 +60,7 @@ trait UploadTrait
return $this->response()->fail(__('admin.upload_file_error')); return $this->response()->fail(__('admin.upload_file_error'));
} }
$path = $file->store(Admin::config('admin.upload.tem_directory.' . $type), Admin::config('admin.upload.disk')); $path = $file->store(Admin::config('admin.upload.tem_directory.' . $type).'/'.date('Y-m-d'), Admin::config('admin.upload.disk'));
return $this->response()->success(['value' => $path]); return $this->response()->success(['value' => $path]);
} }
@ -116,4 +117,83 @@ trait UploadTrait
} }
return $fileArr; return $fileArr;
} }
/**
* 开始分片上传, 生成唯一ID
*/
public function startChunk()
{
$type = 'file';
$fileName = request()->get('filename', '');
$uploadId = md5(time().$fileName);
//创建临时文件夹
if ( Storage::disk(Admin::config('admin.upload.disk'))->exists(Admin::config('admin.upload.tem_directory.' . $type).'/'.$uploadId) === false ) {
if ( Storage::disk(Admin::config('admin.upload.disk'))->makeDirectory(Admin::config('admin.upload.tem_directory.' . $type).'/'.$uploadId) === false ) {
return false;
}
}
return $this->response()->success(['uploadId' => $uploadId]);
}
/**
* 保存分片
*/
public function saveChunk()
{
$type = 'file';
$file = request()->file('file');
$uploadId = request()->get('uploadId');
$partNumber = request()->get('partNumber');
$partSize = request()->get('partSize');
// dd($file);
$fileName = $file->getClientOriginalName();
//判断该分片是否已存在,
$dirPath = Admin::config('admin.upload.tem_directory.' . $type).'/'.$uploadId;
if(Storage::disk(Admin::config('admin.upload.disk'))->exists($dirPath . '/'.$fileName.'_'.$partNumber)){
return $this->response()->fail(__('admin.upload_file_error'));
}else{
//验证分片大小-todo
$path = $file->storeAs($dirPath, $fileName.'_'.$partNumber, Admin::config('admin.upload.disk'));
$realPath = Storage::disk(Admin::config('admin.upload.disk'))->url($path);
$eTag = md5_file($realPath);
return $this->response()->success(['eTag' => $eTag]);
}
}
/**
* 完成分片
*/
public function finishChunk()
{
$type = 'file';
//合并文件
$fileName = request()->get('filename', '');
$uploadId = request()->get('uploadId', '');
$partList = request()->get('partList', []);
$basePath = Admin::config('admin.upload.tem_directory.' . $type).'/'.$uploadId;
$realPath = 'chunk/'.$fileName;
//获取分片列表中序号,查看分片是否都完成上传
$partNumberList = Arr::pluck($partList, 'partNumber');
if(max($partNumberList) === count($partNumberList)){
for($i = 1; $i<=count($partNumberList); $i++){
$_file = Storage::disk(Admin::config('admin.upload.disk'))->get($basePath.'/'.$fileName.'_'.$i);
Storage::disk(Admin::config('admin.upload.disk'))->append($realPath, $_file, null);
}
//删除分片文件夹
Storage::disk(Admin::config('admin.upload.disk'))->deleteDirectory($basePath);
$value = Storage::disk(Admin::config('admin.upload.disk'))->url($realPath);
return $this->response()->success(['value'=>$value]);
}else{
return $this->response()->fail(__('admin.upload_file_error'));
}
}
} }