راکت
حل شده

حذف عکس از فولدر public

4 پاسخ

سلام به همه دوستان.
من تو سایتم یه قسمت دارم که کاربر میتونه مشخصات یک ملک رو به همراه 3 عکس وارد کنه.
حالا میخوام وقتی کاربر تصمیم گرفت ملک رو حذف کنه، عکس های اون ملک هم از فولدر public حذف بشن، ولی مشکلی که هست اینه که اگر کاربر فقط یک عکس واسه ملک انتخاب کنه با استفاده از دستورات زیر عکس از فولدر public حذف میشه ولی اگه 2 یا 3 عکس انتخاب کنه، وقتی ملک رو حذف میکنه فقط از دیتابیس حذف میشه و عکس ها داخل فولدر public باقی میمونه.

public function destroy(int $index)
    {
        $estate = Estate::where('id', $index)->first();
        $year = Carbon::now()->year;
        if (File::exists(public_path("uploads/estates/{$year}/{$estate->images}")))
            File::delete(public_path("uploads/estates/{$year}/{$estate->images}"));
        $estate->delete();
        return redirect()->back();
    }

ممنون میشم راهنمایی کنید.

ثبت پرسش جدید

پاسخ‌ها

4
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

بهترین پاسخ

این قسمتو میبینی متغییر $destinationPath رو به ابتدای نام فایل ها چسبوندم که مسیر کامل در جدول سیو بشه.

$destinationPath = "uploads/estates/{$year}/";

        $images = array();
        if ($files = $request->file('image1')) {
                $filename = $files->getClientOriginalName();
                $rnd = random_int(1, 1000);
                $files->move(public_path($destinationPath), $rnd . $filename);
                $images[] = $destinationPath. $rnd . $filename;
        }

        if ($files = $request->file('image2')) {
                $filename = $files->getClientOriginalName();
                $rnd = random_int(1, 1000);
                $files->move(public_path($destinationPath), $rnd . $filename);
                $images[] = $destinationPath . $rnd . $filename;
        }

        if ($files = $request->file('image3')) {
                $filename = $files->getClientOriginalName();
                $rnd = random_int(1, 1000);
                $files->move(public_path($destinationPath), $rnd . $filename);
                $images[] = $destinationPath . $rnd . $filename;
        }
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

فکر کنم شما آدرس ها رو به صورت یک رشته با که علامت | از هم جدا شده اند ذخیره میکنید.
هنگام حذف بیایید اون رشته رو با explode تبدیل به آرایه کنید و در یک حلقه تک تک تصاویرو حذف کنید

 public function destroy(int $index)
    {
        $estate = Estate::where('id', $index)->first();
     $images = $estate->images;
        $paths = explode('|', $images);
        foreach ($paths as $path) {
            if (File::exists(public_path($path)))
                File::delete(public_path($path));
        }

        $estate->delete();
        return redirect()->back();
    }

شما نباید برای حذف مقدار سالو این طوری بگیرین اینطوری فقط عکس هایی که امروز آپلود شدن حذف میشن.
شما باید آدرس کامل تصویر به همراه نامشو در جدول ذخیره کنی.
مثلا به این شکل که روش شما این طوری است

uploads/estates/2020/image1.jpg|uploads/estates/2020/image2.jpg|uploads/estates/2020/image3.jpg

حالا این رشته رو اگه تبدیل به آرایه کنی در یک حلقه میتونی هر چند تا عکس رو حذف کنی.

Armin Rahmati
Armin Rahmati
@arminrahmati999

@hosseinshirinegad98
تشکر از شما.
مرسی بابت وقتی که گذاشتین.

شاید پاسخ شما همین‌جا باشد

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

خواهش می کنم.

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام