Untitled

 avatar
unknown
plain_text
a year ago
8.2 kB
29
Indexable
<?php

namespace App\Repositories\Upload;

use App\Models\Upload;
use App\Repositories\Upload\UploadInterface;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Intervention\Image\Facades\Image; // Đảm bảo Intervention Image được sử dụng đúng cách

class UploadRepository implements UploadInterface
{
    public function upload($folder = '', $image_id = '', $new_image = null)
    {
        try {
            $image_path = '';

            if ($new_image) {
                $image_folder_path = public_path('uploads/' . $folder);
                
                // Tạo thư mục nếu chưa tồn tại
                if (!File::exists(public_path('uploads'))) {
                    File::makeDirectory(public_path('uploads'), 0755, true);
                }

                if ($folder && !File::exists($image_folder_path)) {
                    File::makeDirectory($image_folder_path, 0755, true);
                }

                $image_name = date('YmdHisA') . \Str::random(5) . '.' . $new_image->getClientOriginalExtension();
                $new_image->move($image_folder_path, $image_name);
                $image_path = 'uploads/' . ($folder ? $folder . '/' : '') . $image_name;
            }

            $upload = Upload::find($image_id);

            if ($upload) {
                if ($upload->original && File::exists(public_path($upload->original))) {
                    unlink(public_path($upload->original)); // Xóa hình ảnh cũ
                }
            } else if ($new_image) {
                $upload = new Upload();
            } else {
                return null;
            }

            if ($image_path) {
                $upload->original = $image_path;
            }

            $upload->save();
            return $upload->id;

        } catch (\Throwable $th) {
            Log::error('Upload failed: ' . $th->getMessage());
            return null;
        }
    }

    public function unlinkImage($image_id = '')
    {
        try {
            $upload = Upload::find($image_id);

            if ($upload) {
                foreach (['original', 'image_one', 'image_two', 'image_three'] as $field) {
                    if ($upload->$field && File::exists(public_path($upload->$field))) {
                        unlink(public_path($upload->$field));
                    }
                }

                $upload->delete();
            }

            return true;

        } catch (\Throwable $th) {
            Log::error('Unlink image failed: ' . $th->getMessage());
            return false;
        }
    }

    public function linktoAvatarUpload($user = null, $avatar_original = null)
    {
        try {
            if ($user && $avatar_original) {
                $file = file_get_contents($avatar_original);
                $file_name = date('YmdHisA') . $user->id . '.jpg';
                $file_path = public_path('uploads/profile/') . $file_name;
                File::put($file_path, $file);

                $upload = new Upload();
                $upload->original = 'uploads/profile/' . $file_name;
                $upload->save();

                return $upload->id;
            }

            return null;

        } catch (\Throwable $th) {
            Log::error('Avatar upload failed: ' . $th->getMessage());
            return null;
        }
    }

    public function linktoImageUpload($folder = '', $image = null)
    {
        try {
            $image_folder_path = public_path('uploads/' . $folder);

            if ($folder && !File::exists($image_folder_path)) {
                File::makeDirectory($image_folder_path, 0755, true);
            }

            if ($image) {
                $file = file_get_contents($image);
                $file_name = date('YmdHisA') . rand(100000, 900000) . '.jpg';
                $file_path = public_path('uploads/' . ($folder ? $folder . '/' : '')) . $file_name;
                File::put($file_path, $file);

                $upload = new Upload();
                $upload->original = 'uploads/' . ($folder ? $folder . '/' : '') . $file_name;
                $upload->image_one = $upload->original;
                $upload->image_two = $upload->original;
                $upload->image_three = $upload->original;
                $upload->save();

                return $upload->id;
            }

            return null;

        } catch (\Throwable $th) {
            Log::error('Image upload failed: ' . $th->getMessage());
            return null;
        }
    }

    public function uploadImage($image, $path, $image_sizes, $old_upload_id)
    {
        try {
            // Xóa các hình ảnh đã tải lên trước đó
            if ($old_upload_id) {
                $this->deleteImage($old_upload_id, 'update');
            }

            $info = getimagesize($image);
            $fileType = strtolower(image_type_to_extension($info[2]));
            $fileType = ltrim($fileType, '.');

            if ($fileType == 'jpg') {
                $fileType = 'jpeg';
            }

            $convertMethod = 'imagecreatefrom' . $fileType;
            $directory = public_path("uploads/" . $path);

            if (!File::exists($directory)) {
                File::makeDirectory($directory, 0755, true);
            }

            // Lưu hình ảnh gốc
            $originalImageName = $this->imageName('original', $fileType);
            $originalImageUrl = $directory . '/' . $originalImageName;
            $this->imageSaveToStorage($convertMethod, $originalImageUrl, $image, 'original');

            $all_url = [];

            foreach ($image_sizes as $key => $image_size) {
                $imageName = $this->imageName(++$key, 'webp');
                $imageUrl = $directory . '/' . $imageName;
                $all_url[] = $imageUrl;
                $this->imageSaveToStorage($convertMethod, $imageUrl, $image, '', $image_size[1], $image_size[0]);
            }

            $upload = $old_upload_id ? Upload::find($old_upload_id) : new Upload();

            if (!$upload) {
                $upload = new Upload();
            }

            $public_path = public_path('uploads');
            $upload->original = str_replace($public_path, 'uploads', $originalImageUrl);
            $upload->image_one = isset($all_url[0]) ? str_replace($public_path, 'uploads', $all_url[0]) : null;
            $upload->image_two = isset($all_url[1]) ? str_replace($public_path, 'uploads', $all_url[1]) : null;
            $upload->image_three = isset($all_url[2]) ? str_replace($public_path, 'uploads', $all_url[2]) : null;
            $upload->save();

            return $upload->id;

        } catch (\Throwable $th) {
            Log::error('Upload image failed: ' . $th->getMessage());
            return null;
        }
    }

    public function imageName($size, $fileType)
    {
        $purpose = date('Y-m-d') . '-' . \Str::random(12) . '-' . $size . '.' . $fileType;
        return str_replace(" ", "-", $purpose);
    }

    public function imageSaveToStorage($convertMethod, $imageUrl, $requestImage, $original, $height = '', $width = '')
    {
        $image = Image::make($convertMethod($requestImage));

        if ($original === 'original') {
            $image->save($imageUrl, 90);
        } else {
            $image->resize($width, $height, function ($constraint) {
                $constraint->aspectRatio();
            })->save($imageUrl, 90);
        }

        return true;
    }

    public function deleteImage($old_upload_id, $slug = 'update')
    {
        try {
            $upload = Upload::find($old_upload_id);

            if ($upload) {
                foreach (['original', 'image_one', 'image_two', 'image_three'] as $field) {
                    if ($upload->$field && File::exists(public_path($upload->$field))) {
                        unlink(public_path($upload->$field));
                    }
                }

                if ($slug === 'delete') {
                    $upload->delete();
                }
            }

            return true;

        } catch (\Throwable $th) {
            Log::error('Delete image failed: ' . $th->getMessage());
            return false;
        }
    }
}
Editor is loading...
Leave a Comment