<?php
namespace App\Traits;
use Carbon\Carbon;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
trait Filepond
{
/**
* Converts the given path into a filepond server id
*
* @param string $path
*
* @return string
*/
public function getServerIdFromPath($path)
{
return Crypt::encryptString($path);
}
/**
* Converts the given filepond server id into a path
*
* @param string $serverId
*
* @return string
*/
public function getPathFromServerId($serverId)
{
if (!trim($serverId)) {
$message = 'The given file path was invalid';
throw new \Exception($message);
}
$filePath = Crypt::decryptString($serverId);
if (!Str::startsWith($filePath, $this->getBasePath())) {
$message = 'The given file path was invalid';
throw new \Exception($message);
}
return $filePath;
}
public function getPublicPathWithFileNameFromServerId($serverId, $driver = 'local')
{
try {
$result['name'] = '';
$result['link'] = '';
$path = $this->getPathFromServerId($serverId);
$file = scandir($path);
if (isset($file[2])) {
$ext = pathinfo($path . '\\' . $file[2], PATHINFO_EXTENSION);
$result['name'] = pathinfo($file[2], PATHINFO_FILENAME);
$current_date = Carbon::now()->format('d-m-Y');
$finalLocation = 'public/uploads/file/' . $current_date;
if (!File::isDirectory($finalLocation)) {
File::makeDirectory($finalLocation, 0777, true, true);
}
$file_name = md5(uniqid()) . '.' . $ext;
$uploaded_file = $path . '/' . $file[2];
$link = $new_file = $finalLocation . '/' . $file_name;
$result['size'] = 0;
if ($driver == 'local') {
File::move($uploaded_file, $new_file);
$result['size'] = File::size(base_path($link)) ?? 0;
} elseif ($driver == 's3') {
Storage::disk('s3')->put($new_file, file_get_contents($uploaded_file), 'public');
$link = Storage::disk('s3')->url($new_file);
}
File::deleteDirectory($path);
$result['extension'] = $ext;
$result['link'] = $link;
return $result;
} else {
return null;
}
} catch (\Exception $exception) {
return null;
}
}
public function getPublicPathFromServerId($serverId, $driver = 'local')
{
try {
$path = $this->getPathFromServerId($serverId);
$file = scandir($path);
if (isset($file[2])) {
$ext = pathinfo($path . '\\' . $file[2], PATHINFO_EXTENSION);
$current_date = Carbon::now()->format('d-m-Y');
$finalLocation = 'public/uploads/file/' . $current_date;
if (!File::isDirectory($finalLocation)) {
File::makeDirectory($finalLocation, 0777, true, true);
}
$file_name = md5(uniqid()) . '.' . $ext;
$uploaded_file = $path . '/' . $file[2];
$link = $new_file = $finalLocation . '/' . $file_name;
if ($driver == 'local') {
File::move($uploaded_file, $new_file);
} elseif ($driver == 's3') {
Storage::disk('s3')->put($new_file, file_get_contents($uploaded_file), 'public');
$link = Storage::disk('s3')->url($new_file);
}
File::deleteDirectory($path);
return $link;
} else {
return null;
}
} catch (\Exception $exception) {
return null;
}
}
/**
* Get the storage base path for files.
*
* @return string
*/
public function getBasePath()
{
return Storage::disk('local')
->path('filepond');
}
}