رضا
3 سال پیش توسط رضا مطرح شد
6 پاسخ

اپلود و تغییر سایز چند تصویر

سلام دوستان
من یک فرم دارم که یک فیلد تصاویر داره و باید تصویر اپلود کنم. این تصاویر به خوبی آپلود و ریسایز می شوند اما وقتی میخوام اون فرم رو ویرایش کنم و نوع سایزیکی از تصویر رو تغییر بدم مثلا اگر 300 هست به 600 بزارم رو نمیدونم چطوری باید ذخیره کنم؟؟؟؟؟ اگر تک عکس بود اون اینپوت رو بصورت$inputs['imagesThumb'] قرار میدادم حل میشد اما الان چون چند تا تصویر دارم نمیدونم چیکار باید انجام بدم.
توضیح تصویر رو وارد کنید
: Controller

public function update(Request $request, Form $form)
{
    if($request->hasfile('images'))
    {
        foreach($request->file('images') as $file)
        {
            $file = $this->UploadImage($file);
            $result[] = $file;
        }
        $inputs['images'] = $result;
    }else {
        $inputs['images'] = $form->images;
        $inputs['images']['thumb'] = $inputs['imagesThumb'];//  این قسمت رو مشکل دارم
    }
    unset($inputs['imagesThumb']);

    $form->update($inputs);
    return back();
}

: edit.blade.php

  <div class="col-sm-12 mb-3">
      <label for="images" class="form-control-label">تصاویر  :</label>
      <div class="col-sm-12 mb-3">
          @if($form->images == null)
              <div class="alert alert-secondary alert-dismissible fade show" role="alert">
                  <span class="alert-icon"><i class="ni ni-image"></i></span>
                  <span class="alert-text">کاربر تصویری برای فرم خود را بارگذاری نکرده است</span>
              </div>
          @else
              @foreach($form->images as $images)
              <div class="col-sm-12">
                  <div class="row">
                      @foreach($images['images'] as $key => $image)
                          <div class="col-sm-2">
                              <label class="control-label">
                                  {{ $key }}
                                  <input type="radio" name="{{$images['thumb']}}" value="{{ $image }}" {{ $images['thumb'] == $image ? 'checked' : '' }} />
                                  <a href="{{ $image }}" target="_blank"><img src="{{ $image }}" width="100%"></a>
                              </label>
                          </div>
                      @endforeach
                  </div>
              </div>
              @endforeach
          @endif
      </div>
      <div class="custom-file">
          <input type="file" class="custom-file-input @error('images') is-invalid @enderror" name="images[]" id="images" multiple>
          @error('images')
          <span class="invalid-feedback" role="alert">
              <strong>{{ $message }}</strong>
          </span>
          @enderror
          <label class="custom-file-label" for="images">تصایر  را وارد کنید</label>
      </div>
  </div>

در داخل کنترلرم با dd($request->all()) لاگ گرفتم و وقتی یک سایز دیگری از تصویر رو انتخاب میکنم خروجیش به این شکله:

array:12 [▼
  "_token" => "JCVS4QF5lXTTno21vdVQjExA0vszfqblK50fYIDa"
  "_method" => "patch"
  "title" => "تراکتور رومانی"
  "/storage/uploads/images/300_2020_12_25_26b48a491115ed63b660wXkDI5mt_1_png" => "/storage/uploads/images/300_2020_12_25_26b48a491115ed63b660wXkDI5mt.1.png"
  "/storage/uploads/images/300_2020_12_25_12567efe48d699fd052ewXkDI5mt_2_png" => "/storage/uploads/images/600_2020_12_25_12567efe48d699fd052ewXkDI5mt.2.png"
  "/storage/uploads/images/300_2020_12_25_6da518d9752ad0e28aaewXkDI5mt_4_png" => "/storage/uploads/images/300_2020_12_25_6da518d9752ad0e28aaewXkDI5mt.4.png"
  "/storage/uploads/images/300_2020_12_25_65509804bda5c9c381d6wXkDI5mt_png" => "/storage/uploads/images/300_2020_12_25_65509804bda5c9c381d6wXkDI5mt.png"
]

@mhyeganeh @hosseinshirinegad98 @nimageneral @SobhanDadkhah @endworld @hesammousavi


ثبت پرسش جدید
حسین شیخ بارانی
تخصص : طراحی سایت
@abdgod 3 سال پیش مطرح شد
0

سلام
به جای ذخیره چند تصویر یک تصویر ذخبره کن و زمان نمایش با کیفیت ها که نیاز داری نمایش بده
این کار رو با کتاب خانه GD در php می تونی انجام بدی


رضا
تخصص : Laravel Developer
@Megairan 3 سال پیش مطرح شد
0

سلام @abdgod
ممنونم بابت پاسخگویی تون
روشی که شما فرمودید بهینه نیست و من اگر بخواهم هر زمان که تصویر نیاز داشته باشم و تصاویر رو ریسایز کنم پردازش های زیادی باید انجام بدم و به سرور فشار خواهد اومد پس بهترهه یکبار مراحل ریسایز صورت بگیرهه و در دیتابیس ذخیره بشه و هر زمان که نیاز بود اون عکس رو از دیتابیس فراخوانی کنم و نمایش بدم در این روش تصاویر بصورت جیسون در فیلد images دیتابیس ذخیره میشن


رضا
تخصص : Laravel Developer
@Megairan 3 سال پیش مطرح شد
0

کسی نیست ما را یاری کند؟!؟؟


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 3 سال پیش مطرح شد
1

درود بر شما
در تصویری که فرستادید radio دارید
خوب یک name برای radio با value های متفاوت در نظر بگیرید و زمانی که ارسال میشه مقدار مورد نظر رو بگیرید و واکشی کنید و ذخیره سازی انجام بدید !


محمد عابدی
تخصص : Senior Web Developer
@abedim910 3 سال پیش مطرح شد
1

@Megairan @abdgod درود
درسته این روش بهینه نیست ولی میتونید بهینش کنید !
چطوری؟
وقتی یکبار یک درخواست ارسال میشه image باید کش شه و image کانورت شده ذخیره شه با یک پترن مشخص
filename_width_height.ext میتونه این باشه.
اینجوری به هر سایزی بخواید دسترسی دارید و هیچ باری روی سرور شما نمیاره


رضا
تخصص : Laravel Developer
@Megairan 3 سال پیش آپدیت شد
0

@hesammousavi ممنونم اقای موسوی بابت راهنمایی تون
همانطور که گفتید سمت فرانت برای اسم ها مقادیر خود تصاویر رو ست کردم.که خروجی ریکوست بدین صورت هست. و دقیقا مثل تصویر سوال بالا، برای عکس ردیف دومی سایز 600 رو انتخاب کردم. حالا سمت بکند چطوری باید پیمایش کنم که مقادیر اون تصویر از ورودی رو جای همون thumb ذخیره کنم؟

array:4 [▼
  "_token" => "JCVS4QF5lXTTno21vdVQjExA0vszfqblK50fYIDa"
  "_method" => "patch"
  "title" => "تراکتور رومانی"
  "imagesThumb" => array:4 [▼
  "/storage/uploads/images/300_2020_12_25_26b48a491115ed63b660wXkDI5mt_1_png" => "/storage/uploads/images/300_2020_12_25_26b48a491115ed63b660wXkDI5mt.1.png"
  "/storage/uploads/images/300_2020_12_25_12567efe48d699fd052ewXkDI5mt_2_png" => "/storage/uploads/images/600_2020_12_25_12567efe48d699fd052ewXkDI5mt.2.png"
  "/storage/uploads/images/300_2020_12_25_6da518d9752ad0e28aaewXkDI5mt_4_png" => "/storage/uploads/images/300_2020_12_25_6da518d9752ad0e28aaewXkDI5mt.4.png"
  "/storage/uploads/images/300_2020_12_25_65509804bda5c9c381d6wXkDI5mt_png" => "/storage/uploads/images/300_2020_12_25_65509804bda5c9c381d6wXkDI5mt.png"
  ]
]

یک کدی سمت بکند نوشتم ولی نمیدونم چطوری مقادیر اون تصویر از ورودی رو جای همون thumb ذخیره کنم..!!!!

// پیمایش تصاویر تامب دیتابیس  
foreach ($form->images as $image){
    $thumbDB[] = $image['thumb'];
}
array_replace($thumbDB, array_intersect_key(array_diff(array_values($inputs['imagesThumb']),$thumbDB), $thumbDB));

توی قسمت دوم مقدار اینپوتی که تغییر کرده رو با مقدار تامب دیتابیس مقایسه میکنم و اگر تغییر کرده بود جایگزینش میکنم که خروجیش بدین صورت میشه اما توی ذخیره کردنش مشکل دارم البته ممکنه روش بهتری هم سراغ داشته باشید

array:4 [▼
  0 => "/storage/uploads/files/2020/images/300_2020_12_25_26b48a491115ed63b660wXkDI5mt.1.png"
  1 => "/storage/uploads/files/2020/images/600_2020_12_25_12567efe48d699fd052ewXkDI5mt.2.png"
  2 => "/storage/uploads/files/2020/images/300_2020_12_25_6da518d9752ad0e28aaewXkDI5mt.4.png"
  3 => "/storage/uploads/files/2020/images/300_2020_12_25_65509804bda5c9c381d6wXkDI5mt.png"
]

updated:
@ali.bayat @behzad.azizan @juza66 @abedim910 دوستان شما نظری ندارید؟؟؟


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

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