header('Content-Range'), 'bytes %d-%d/%d') ?: []; $this->merge([ 'range_start' => $parsed[0] ?? null, 'range_end' => $parsed[1] ?? null, 'total_size' => $parsed[2] ?? null, 'file_name' => strtolower(rawurldecode((string) $this->header('X-File-Name', 'upload'))), 'upload_id' => $this->header('X-Upload-Id'), ]); } /** * @return array> */ public function rules(): array { $allowedSuffixes = collect([MediaType::Image, MediaType::Video, MediaType::Document]) ->flatMap(fn (MediaType $type) => $type->extensions()) ->map(fn (string $ext) => '.'.$ext) ->all(); return [ 'range_start' => ['required', 'integer', 'min:0'], 'range_end' => ['required', 'integer', 'gte:range_start'], 'total_size' => ['required', 'integer', 'min:1', 'max:'.MediaType::Video->maxSizeInBytes()], 'file_name' => ['required', 'string', 'ends_with:'.implode(',', $allowedSuffixes)], 'upload_id' => ['required', 'string', 'uuid'], ]; } /** * @return array */ public function messages(): array { return [ 'total_size.max' => __('assets.upload.file_too_large', ['max' => MediaType::Video->maxSizeInMb()]), ]; } }