mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-29 03:10:51 +00:00
upload file into request folder and get their thumbnails
This commit is contained in:
@@ -46,7 +46,7 @@ class VisitorBrowseFolderController
|
||||
->get();
|
||||
|
||||
// Set thumbnail links for public files
|
||||
$files->map(fn ($file) => $file->setPublicUrl($shared->token));
|
||||
$files->map(fn ($file) => $file->setSharedPublicUrl($shared->token));
|
||||
|
||||
return [
|
||||
'folders' => new FolderCollection($folders),
|
||||
|
||||
@@ -62,7 +62,7 @@ class VisitorSearchFilesAndFoldersController extends Controller
|
||||
->take(3);
|
||||
|
||||
// Map files and set public url for files
|
||||
$files->map(fn ($file) => $file->setPublicUrl($shared->token));
|
||||
$files->map(fn ($file) => $file->setSharedPublicUrl($shared->token));
|
||||
|
||||
$folders = Folder::search($query)
|
||||
->constrain($folderConstrain)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
namespace Domain\Files\Actions;
|
||||
|
||||
use App\Users\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
use Domain\Sharing\Models\Share;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
@@ -29,7 +29,7 @@ class UploadFileAction
|
||||
*/
|
||||
public function __invoke(
|
||||
UploadRequest $request,
|
||||
?Share $shared = null,
|
||||
?string $userId = null,
|
||||
) {
|
||||
$file = $request->file('file');
|
||||
|
||||
@@ -62,7 +62,7 @@ class UploadFileAction
|
||||
$disk_local = Storage::disk('local');
|
||||
|
||||
// Get user data
|
||||
$user = $shared->user ?? Auth::user();
|
||||
$user = $userId ? User::find($userId) : Auth::user();
|
||||
|
||||
// File Info
|
||||
$fileSize = $disk_local->size("chunks/$chunkName");
|
||||
@@ -98,7 +98,7 @@ class UploadFileAction
|
||||
'metadata' => $metadata,
|
||||
'name' => $request->input('filename'),
|
||||
'basename' => $fileName,
|
||||
'author' => $shared ? 'visitor' : 'user',
|
||||
'author' => $userId ? 'visitor' : 'user',
|
||||
'filesize' => $fileSize,
|
||||
'user_id' => $user->id,
|
||||
]);
|
||||
|
||||
@@ -53,7 +53,7 @@ class VisitorGetFileController extends Controller
|
||||
user_id: $shared->user_id,
|
||||
);
|
||||
|
||||
// Finally download file
|
||||
// Finally, download file
|
||||
return ($this->downloadFile)($file, $shared->user_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ class VisitorShowFileController
|
||||
Gate::authorize('can-view', [$file, $shared]);
|
||||
|
||||
// Set access urls
|
||||
$file->setPublicUrl($shared->token);
|
||||
$file->setSharedPublicUrl($shared->token);
|
||||
|
||||
return response(new FileResource($file), 200);
|
||||
}
|
||||
|
||||
@@ -50,10 +50,10 @@ class VisitorUploadFileController extends Controller
|
||||
|
||||
try {
|
||||
// Return new uploaded file
|
||||
$file = ($this->uploadFile)($request, $shared);
|
||||
$file = ($this->uploadFile)($request, $shared->user_id);
|
||||
|
||||
// Set public access url
|
||||
$file->setPublicUrl($shared->token);
|
||||
$file->setSharedPublicUrl($shared->token);
|
||||
|
||||
return response(new FileResource($file), 201);
|
||||
} catch (InvalidUserActionException $e) {
|
||||
|
||||
@@ -43,7 +43,8 @@ class File extends Model
|
||||
use HasFactory;
|
||||
use Sortable;
|
||||
|
||||
public ?string $public_access = null;
|
||||
public ?string $sharedAccess = null;
|
||||
public ?string $uploadRequestAccess = null;
|
||||
|
||||
protected $guarded = [
|
||||
'id',
|
||||
@@ -78,11 +79,19 @@ class File extends Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Set routes with public access
|
||||
* Set shared routes with public access
|
||||
*/
|
||||
public function setPublicUrl(string $token)
|
||||
public function setSharedPublicUrl(string $token)
|
||||
{
|
||||
$this->public_access = $token;
|
||||
$this->sharedAccess = $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set upload request routes with public access
|
||||
*/
|
||||
public function setUploadRequestPublicUrl(string $token)
|
||||
{
|
||||
$this->uploadRequestAccess = $token;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,7 +103,7 @@ class File extends Model
|
||||
$thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all();
|
||||
|
||||
// Generate thumbnail link for external storage service
|
||||
if ($this->type === 'image' && ! is_storage_driver(['local'])) {
|
||||
if ($this->type === 'image' && ! is_storage_driver('local')) {
|
||||
foreach ($thumbnail_sizes as $item) {
|
||||
$filePath = "files/{$this->user_id}/{$item['name']}-{$this->basename}";
|
||||
|
||||
@@ -106,11 +115,19 @@ class File extends Model
|
||||
|
||||
// Generate thumbnail link for local storage
|
||||
if ($this->type === 'image') {
|
||||
|
||||
foreach ($thumbnail_sizes as $item) {
|
||||
$route = route('thumbnail', ['name' => $item['name'] . '-' . $this->basename]);
|
||||
|
||||
if ($this->public_access) {
|
||||
$route .= "/$this->public_access";
|
||||
// Set shared public url
|
||||
if ($this->sharedAccess) {
|
||||
$route .= "/shared/$this->sharedAccess";
|
||||
}
|
||||
|
||||
// Set upload request public url
|
||||
if ($this->uploadRequestAccess) {
|
||||
// TODO: review request for s3
|
||||
$route .= "/upload-request/$this->uploadRequestAccess";
|
||||
}
|
||||
|
||||
$links[$item['name']] = $route;
|
||||
@@ -147,8 +164,15 @@ class File extends Model
|
||||
// Get thumbnail from local storage
|
||||
$route = route('file', ['name' => $this->attributes['basename']]);
|
||||
|
||||
if ($this->public_access) {
|
||||
return "$route/$this->public_access";
|
||||
// Set shared public url
|
||||
if ($this->sharedAccess) {
|
||||
return "$route/$this->sharedAccess";
|
||||
}
|
||||
|
||||
// Set upload request public url
|
||||
if ($this->uploadRequestAccess) {
|
||||
// TODO: review request for s3
|
||||
$route .= "/upload-request/$this->uploadRequestAccess";
|
||||
}
|
||||
|
||||
return $route;
|
||||
|
||||
@@ -10,8 +10,6 @@ class FileResource extends JsonResource
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* TODO: optimize created_at/updated_at conversion because of performance issue
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
|
||||
@@ -60,7 +60,7 @@ class VisitorRenameFileOrFolderController extends Controller
|
||||
|
||||
// Set public url
|
||||
if ($request->input('type') !== 'folder') {
|
||||
$item->setPublicUrl($shared->token);
|
||||
$item->setSharedPublicUrl($shared->token);
|
||||
}
|
||||
|
||||
if ($request->input('type') === 'folder') {
|
||||
|
||||
@@ -26,7 +26,7 @@ class WebCrawlerOpenGraphController extends Controller
|
||||
->first();
|
||||
|
||||
if ($item->thumbnail) {
|
||||
$item->setPublicUrl($share->token);
|
||||
$item->setSharedPublicUrl($share->token);
|
||||
}
|
||||
|
||||
return view('vuefilemanager.crawler.og-view')
|
||||
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
namespace Domain\UploadRequest\Controllers\FileAccess;
|
||||
|
||||
use Domain\Files\Actions\DownloadFileAction;
|
||||
use Domain\Sharing\Actions\ProtectShareRecordAction;
|
||||
use Domain\Sharing\Actions\VerifyAccessToItemWithinAction;
|
||||
use Domain\Traffic\Actions\RecordDownloadAction;
|
||||
use Domain\UploadRequest\Models\UploadRequest;
|
||||
use Gate;
|
||||
use Domain\Files\Models\File;
|
||||
use Illuminate\Http\Response;
|
||||
use Domain\Sharing\Models\Share;
|
||||
use Domain\Files\Resources\FileResource;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
|
||||
/**
|
||||
* Get shared file record
|
||||
*/
|
||||
class GetFileFromUploadRequestController
|
||||
{
|
||||
public function __construct(
|
||||
private DownloadFileAction $downloadFile,
|
||||
private RecordDownloadAction $recordDownload,
|
||||
) {
|
||||
}
|
||||
|
||||
public function __invoke(
|
||||
string $filename,
|
||||
UploadRequest $uploadRequest
|
||||
): BinaryFileResponse {
|
||||
// Get file
|
||||
$file = File::where('user_id', $uploadRequest->user_id)
|
||||
->where('basename', $filename)
|
||||
->firstOrFail();
|
||||
|
||||
// Store user download size
|
||||
($this->recordDownload)(
|
||||
file_size: (int) $file->getRawOriginal('filesize'),
|
||||
user_id: $uploadRequest->user_id,
|
||||
);
|
||||
|
||||
// Finally, download file
|
||||
return ($this->downloadFile)($file, $uploadRequest->user_id);
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
namespace Domain\UploadRequest\Controllers\FileAccess;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Domain\Files\Actions\DownloadThumbnailAction;
|
||||
use Domain\Traffic\Actions\RecordDownloadAction;
|
||||
use Domain\UploadRequest\Models\UploadRequest;
|
||||
use Domain\Files\Models\File;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
|
||||
/**
|
||||
* Get shared file record
|
||||
*/
|
||||
class GetThumbnailFromUploadRequestController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private DownloadThumbnailAction $downloadThumbnail,
|
||||
private RecordDownloadAction $recordDownload,
|
||||
) {
|
||||
}
|
||||
|
||||
public function __invoke(
|
||||
string $filename,
|
||||
UploadRequest $uploadRequest
|
||||
): StreamedResponse {
|
||||
$originalFileName = substr($filename, 3);
|
||||
|
||||
// Get file
|
||||
$file = File::where('user_id', $uploadRequest->user_id)
|
||||
->where('basename', $originalFileName)
|
||||
->firstOrFail();
|
||||
|
||||
// Store user download size
|
||||
($this->recordDownload)(
|
||||
file_size: (int) $file->getRawOriginal('filesize'),
|
||||
user_id: $uploadRequest->user_id,
|
||||
);
|
||||
|
||||
// Finally, download thumbnail
|
||||
return ($this->downloadThumbnail)($filename, $file);
|
||||
}
|
||||
}
|
||||
@@ -2,30 +2,73 @@
|
||||
|
||||
namespace Domain\UploadRequest\Controllers;
|
||||
|
||||
use DB;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use App\Users\Exceptions\InvalidUserActionException;
|
||||
use Domain\Files\Resources\FileResource;
|
||||
use Domain\UploadRequest\Models\UploadRequest;
|
||||
use Illuminate\Http\Request;
|
||||
use Domain\Files\Actions\UploadFileAction;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use Illuminate\Contracts\Filesystem\FileNotFoundException;
|
||||
use DB;
|
||||
|
||||
class UploadFilesForUploadRequestController
|
||||
{
|
||||
public function __invoke(Request $request, UploadRequest $uploadRequest)
|
||||
public function __construct(
|
||||
private UploadFileAction $uploadFile,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* @throws FileNotFoundException
|
||||
*/
|
||||
public function __invoke(\Domain\Files\Requests\UploadRequest $request, UploadRequest $uploadRequest)
|
||||
{
|
||||
// Check if upload request is active
|
||||
if ($uploadRequest->status !== 'active') {
|
||||
return response('Gone', 410);
|
||||
}
|
||||
|
||||
// Get upload request root folder query
|
||||
$folder = Folder::where('id', $uploadRequest->id);
|
||||
|
||||
// Create folder if not exist
|
||||
if ($folder->doesntExist()) {
|
||||
|
||||
$timestampName = format_date($uploadRequest->created_at, 'd. M. Y');
|
||||
|
||||
DB::table('folders')->insert([
|
||||
'id' => $uploadRequest->id,
|
||||
'parent_id' => $uploadRequest->folder_id,
|
||||
'user_id' => $uploadRequest->user_id,
|
||||
'name' => "Upload Request from $timestampName",
|
||||
]);
|
||||
$this->createFolder($uploadRequest);
|
||||
}
|
||||
|
||||
return response('Done!', 201);
|
||||
try {
|
||||
// Set default parent_id for uploaded file
|
||||
if (is_null($request->input('parent_id'))) {
|
||||
$request->merge(['parent_id' => $uploadRequest->id]);
|
||||
}
|
||||
|
||||
// Upload file
|
||||
$file = ($this->uploadFile)($request, $uploadRequest->user_id);
|
||||
|
||||
// Set public access url
|
||||
$file->setUploadRequestPublicUrl($uploadRequest->id);
|
||||
|
||||
// Return new uploaded file
|
||||
return response(new FileResource($file), 201);
|
||||
|
||||
} catch (InvalidUserActionException $e) {
|
||||
return response([
|
||||
'type' => 'error',
|
||||
'message' => $e->getMessage(),
|
||||
], 401);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create root Upload Request folder
|
||||
*/
|
||||
private function createFolder(UploadRequest $uploadRequest): void
|
||||
{
|
||||
$timestampName = format_date($uploadRequest->created_at, 'd. M. Y');
|
||||
|
||||
DB::table('folders')->insert([
|
||||
'id' => $uploadRequest->id,
|
||||
'parent_id' => $uploadRequest->folder_id,
|
||||
'user_id' => $uploadRequest->user_id,
|
||||
'name' => "Upload Request from $timestampName",
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ namespace Domain\UploadRequest\Models;
|
||||
|
||||
use App\Users\Models\User;
|
||||
use Database\Factories\UploadRequestFactory;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
@@ -43,6 +44,11 @@ class UploadRequest extends Model
|
||||
return $this->hasOne(User::class, 'id', 'user_id');
|
||||
}
|
||||
|
||||
public function folder(): HasOne
|
||||
{
|
||||
return $this->hasOne(Folder::class, 'id', 'id');
|
||||
}
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Domain\UploadRequest\Resources;
|
||||
|
||||
use Domain\Folders\Resources\FolderResource;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class UploadRequestResource extends JsonResource
|
||||
@@ -20,6 +21,9 @@ class UploadRequestResource extends JsonResource
|
||||
'url' => url("/request/$this->id/upload"),
|
||||
],
|
||||
'relationships' => [
|
||||
$this->mergeWhen($this->folder, fn () => [
|
||||
'folder' => new FolderResource($this->folder),
|
||||
]),
|
||||
'user' => [
|
||||
'data' => [
|
||||
'id' => $this->user->id,
|
||||
|
||||
Reference in New Issue
Block a user