190 lines
5.9 KiB
PHP
190 lines
5.9 KiB
PHP
<?php
|
|
namespace App\Http\Traits;
|
|
use App\Models\Format;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
trait MediaTools {
|
|
|
|
public function get_file_size($file_path) {
|
|
return $this->fix_integer_overflow(filesize($file_path));
|
|
}
|
|
|
|
public function create_thumb($media) {
|
|
$formats = $media->sujet->formats;
|
|
$mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension;
|
|
$im = new \Imagick($mediaPath);
|
|
$im->setImageBackgroundColor('#ffffff');
|
|
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
|
|
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
|
|
$im->stripImage();
|
|
if(in_array($media->extension, array("pdf", "ai", "psd")) ){
|
|
$im->setIteratorIndex(0);
|
|
}
|
|
|
|
foreach ($formats as $format) {
|
|
|
|
$fp = public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$format->extension;
|
|
$targetWidth = $format->largeur;
|
|
if($format->hauteur == 0){
|
|
$targetHeight = floor(($media->hauteur*$format->largeur)/$media->largeur);
|
|
}else{
|
|
$targetHeight = $format->hauteur;
|
|
}
|
|
|
|
$im->setImageFormat($format->extension);
|
|
if($media->largeur >= $targetWidth || $media->hauteur >= $targetHeight){
|
|
$im->thumbnailImage($targetWidth, $targetHeight , true);
|
|
}
|
|
$im->writeImage($fp);
|
|
}
|
|
$im->destroy();
|
|
unset($im);
|
|
}
|
|
|
|
public function create_sys_thumb($media) {
|
|
$mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension;
|
|
$im = new \Imagick();
|
|
$im->readImage($mediaPath);
|
|
|
|
if(in_array($media->extension, array("pdf", "ai", "psd")) ){
|
|
$extension = "png";
|
|
$im->setIteratorIndex(0);
|
|
}else{
|
|
$extension = $media->extension;
|
|
}
|
|
|
|
/* Handle CMJN - DOESN'T WORK
|
|
if ($im->getImageColorspace() === \Imagick::COLORSPACE_CMYK){
|
|
$im->transformImageColorspace(\Imagick::COLORSPACE_RGB);
|
|
}*/
|
|
|
|
// create preview
|
|
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('libelle', '=', 'preview')->first();
|
|
$fp = public_path()."/".$media->folder.$media->uid.'_preview.'.$extension;
|
|
if($media->extension == "gif" ){
|
|
if($media->largeur >= $format->largeur || $media->hauteur >= $format->hauteur || $media->largeur == ""){
|
|
$im = $im->coalesceImages();
|
|
foreach ($im as $frame) {
|
|
$frame->thumbnailImage($format->largeur, $format->hauteur);
|
|
$frame->setImagePage($format->largeur, $format->hauteur, 0, 0);
|
|
}
|
|
$im = $im->deconstructImages();
|
|
}
|
|
$im->writeImages($fp, true);
|
|
}else{
|
|
if($media->largeur >= $format->largeur || $media->hauteur >= $format->hauteur || $media->largeur == ""){
|
|
$im->thumbnailImage($format->largeur, $format->hauteur , true);
|
|
}
|
|
$im->writeImage($fp);
|
|
}
|
|
|
|
|
|
// create thumb
|
|
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('libelle', '=', 'thumb')->first();
|
|
if ($extension != "png"){
|
|
$im->setImageBackgroundColor('#ffffff');
|
|
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
|
|
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
|
|
$im->stripImage();
|
|
}
|
|
$fp = public_path()."/".$media->folder.$media->uid.'_thumb.'.$extension;
|
|
$im->thumbnailImage($format->largeur, $format->hauteur , true);
|
|
$im->writeImage($fp);
|
|
$im->destroy();
|
|
unset($im);
|
|
}
|
|
|
|
public function get_mediaFolder() {
|
|
$mediaPath = "medias/";
|
|
$directories = Storage::allDirectories($mediaPath );
|
|
$selectedFolder = "";
|
|
|
|
// on obtient le dernier dossier créé
|
|
foreach ($directories as $key => $foldername) {
|
|
if($selectedFolder < $foldername){
|
|
$selectedFolder = $foldername;
|
|
}
|
|
}
|
|
// si on n'a pas de dossier, on le créé
|
|
if($selectedFolder == ""){
|
|
$selectedFolder = $mediaPath.uniqid();
|
|
Storage::makeDirectory($selectedFolder);
|
|
}else{
|
|
// on compte le nombre de fichier
|
|
$files = Storage::allFiles($selectedFolder);
|
|
// si on en a plus de 1000, on créé un nouveau dossier
|
|
if(count($files)> 1000){
|
|
$selectedFolder = $mediaPath.uniqid();
|
|
Storage::makeDirectory($selectedFolder);
|
|
}
|
|
}
|
|
return $selectedFolder;
|
|
}
|
|
|
|
public function fix_integer_overflow($size) {
|
|
if ($size < 0) {
|
|
$size += 2.0 * (PHP_INT_MAX + 1);
|
|
}
|
|
return $size;
|
|
}
|
|
|
|
public function formatBytes($octet, $precision = 2) {
|
|
// Array contenant les differents unités
|
|
$unite = array('octet','Ko','Mo','Go');
|
|
|
|
if ($octet < 1000) // octet
|
|
{
|
|
return $octet.$unite[0];
|
|
}
|
|
else
|
|
{
|
|
if ($octet < 1000000) // ko
|
|
{
|
|
$ko = round($octet/1024,2);
|
|
return $ko.$unite[1];
|
|
}
|
|
else // Mo ou Go
|
|
{
|
|
if ($octet < 1000000000) // Mo
|
|
{
|
|
$mo = round($octet/(1024*1024),2);
|
|
return $mo.$unite[2];
|
|
}
|
|
else // Go
|
|
{
|
|
$go = round($octet/(1024*1024*1024),2);
|
|
return $go.$unite[3];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ---- Renvoi le chemin attendu d'un média selon le format demandé
|
|
public function get_mediaPath($media, $format = "") {
|
|
|
|
// format original
|
|
if($format == ""){
|
|
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
|
|
}
|
|
|
|
// format spécifique
|
|
if($format->system == 0){
|
|
if(in_array($media->extension, array("gif", "jpeg", "jpg", "png", "pdf", "ai", "psd")) ){
|
|
return public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$format->extension;
|
|
}else{
|
|
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
|
|
}
|
|
}
|
|
|
|
// format système (thumb et preview)
|
|
if($format->system == 1){
|
|
if(in_array($media->extension, array("gif", "jpeg", "jpg", "png")) ){
|
|
return public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$media->extension;
|
|
}elseif(in_array($media->extension, array("pdf", "ai", "psd"))){
|
|
return public_path()."/".$media->folder.$media->uid.'.png';
|
|
}else{
|
|
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
|
|
}
|
|
}
|
|
}
|
|
}
|