2017-09-14 22:21:00 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Traits;
|
|
|
|
|
2021-02-10 12:08:39 +03:00
|
|
|
use App\Models\Common\Media as MediaModel;
|
2021-05-08 18:18:00 +03:00
|
|
|
use App\Utilities\Date;
|
|
|
|
use Illuminate\Support\Facades\Storage;
|
2021-04-16 00:59:43 +03:00
|
|
|
use MediaUploader;
|
2017-12-28 17:20:16 +03:00
|
|
|
|
2017-09-14 22:21:00 +03:00
|
|
|
trait Uploads
|
|
|
|
{
|
2021-05-08 18:18:00 +03:00
|
|
|
public $company_id_index = 3;
|
2017-12-28 17:20:16 +03:00
|
|
|
|
2018-01-02 19:00:07 +03:00
|
|
|
public function getMedia($file, $folder = 'settings', $company_id = null)
|
2017-12-28 17:20:16 +03:00
|
|
|
{
|
2018-01-02 19:00:07 +03:00
|
|
|
$path = '';
|
|
|
|
|
|
|
|
if (!$file || !$file->isValid()) {
|
|
|
|
return $path;
|
|
|
|
}
|
|
|
|
|
2021-05-08 18:18:00 +03:00
|
|
|
$path = $this->getMediaFolder($folder, $company_id);
|
2017-12-28 17:20:16 +03:00
|
|
|
|
2018-01-02 16:22:30 +03:00
|
|
|
return MediaUploader::fromSource($file)->toDirectory($path)->upload();
|
2017-12-28 17:20:16 +03:00
|
|
|
}
|
2019-03-25 16:11:03 +03:00
|
|
|
|
|
|
|
public function importMedia($file, $folder = 'settings', $company_id = null, $disk = null)
|
|
|
|
{
|
|
|
|
$path = '';
|
|
|
|
|
|
|
|
if (!$disk) {
|
|
|
|
$disk = config('mediable.default_disk');
|
|
|
|
}
|
|
|
|
|
2021-05-08 18:18:00 +03:00
|
|
|
$path = $this->getMediaFolder($folder, $company_id) . '/' . basename($file);
|
2019-03-25 16:11:03 +03:00
|
|
|
|
|
|
|
return MediaUploader::importPath($disk, $path);
|
|
|
|
}
|
2021-02-10 12:08:39 +03:00
|
|
|
|
|
|
|
public function deleteMediaModel($model, $parameter, $request = null)
|
|
|
|
{
|
|
|
|
$medias = $model->$parameter;
|
|
|
|
|
|
|
|
if (!$medias) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$already_uploaded = [];
|
|
|
|
|
|
|
|
if ($request && isset($request['uploaded_' . $parameter])) {
|
|
|
|
$uploaded = $request['uploaded_' . $parameter];
|
|
|
|
|
|
|
|
if (count($medias) == count($uploaded)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($uploaded as $old_media) {
|
|
|
|
$already_uploaded[] = $old_media['id'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ((array)$medias as $media) {
|
|
|
|
if (in_array($media->id, $already_uploaded)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
MediaModel::where('id', $media->id)->delete();
|
|
|
|
}
|
|
|
|
}
|
2021-05-08 18:18:00 +03:00
|
|
|
|
|
|
|
public function getMediaFolder($folder, $company_id = null)
|
|
|
|
{
|
|
|
|
if (!$company_id) {
|
|
|
|
$company_id = company_id();
|
|
|
|
}
|
|
|
|
|
|
|
|
$date = Date::now()->format('Y/m/d');
|
|
|
|
|
|
|
|
// 2021/04/09/34235/invoices
|
|
|
|
return $date . '/' . $company_id . '/' . $folder;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getMediaPathOnStorage($media)
|
|
|
|
{
|
|
|
|
if (!is_object($media)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$path = $media->basename;
|
|
|
|
|
|
|
|
if (!empty($media->directory)) {
|
|
|
|
// 2021/04/09/34235/invoices
|
|
|
|
$folders = explode('/', $media->directory);
|
|
|
|
|
|
|
|
// No company_id in folder path
|
|
|
|
if (empty($folders[$this->company_id_index])) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if company can access media
|
|
|
|
if ($folders[$this->company_id_index] != company_id()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$path = $media->directory . '/' . $media->basename;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Storage::exists($path)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Storage::path($path);
|
|
|
|
}
|
2021-05-11 23:43:19 +03:00
|
|
|
|
|
|
|
public function streamMedia($media, $path = '', $action = '')
|
|
|
|
{
|
|
|
|
if ($this->isLocalStorage()) {
|
|
|
|
if (empty($path)) {
|
|
|
|
$path = $this->getMediaPathOnStorage($media);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (empty($action)) {
|
|
|
|
$action = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->streamLocalMedia($path, $action);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->streamRemoteMedia($media);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function streamLocalMedia($path, $action)
|
|
|
|
{
|
|
|
|
$function = ($action == 'get') ? 'file' : $action;
|
|
|
|
|
|
|
|
return response()->$function($path);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function streamRemoteMedia($media)
|
|
|
|
{
|
|
|
|
return response()->streamDownload(
|
|
|
|
function() use ($media) {
|
|
|
|
$stream = $media->stream();
|
|
|
|
|
|
|
|
while($bytes = $stream->read(1024)) {
|
|
|
|
echo $bytes;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
$media->basename,
|
|
|
|
[
|
|
|
|
'Content-Type' => $media->mime_type,
|
|
|
|
'Content-Length' => $media->size,
|
|
|
|
],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function isLocalStorage()
|
|
|
|
{
|
|
|
|
return config('filesystems.disks.' . config('filesystems.default') . '.driver') == 'local';
|
|
|
|
}
|
2017-12-28 17:20:16 +03:00
|
|
|
}
|