Armin Rahmati
5 سال پیش توسط Armin Rahmati مطرح شد
9 پاسخ

آپلود اختیاری تصویر

سلام خدمت دوستان
من میخوام آپلود عکس اختیاری باشه، وقتی عکس آپلود میکنم مشکلی پیش نمیاد ولی وقتی عکس آپلود نمیکنم، ارور زیر نمایش داده می شود.

Call to a member function getClientOriginalName() on null
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Intervention\Image\Facades\Image;

class AdminController extends Controller
{
    protected function uploadImages($file) {

        $year = Carbon::now()->year;
        $imagePath = "/upload/images/{$year}/";
        $filename = $file->getClientOriginalName();

        $file = $file->move(public_path($imagePath) , $filename);

        $sizes = ["300" , "600" , "900"];
        $url['images'] = $this->resize($file->getRealPath() , $sizes , $imagePath , $filename);
        $url['thumb'] = $url['images'][$sizes[0]];

        return $url;

    }

    private function resize($path , $sizes , $imagePath , $filename) {

        $images['original'] = $imagePath . $filename;
        foreach ($sizes as $size) {
            $images[$size] = $imagePath . "{$size}_" . $filename;

            Image::make($path)->resize($size, null, function ($constraint) {
                $constraint->aspectRatio();
            })->save(public_path($images[$size]));
        }
        return $images;
    }
}
public function store(ArticleRequest $request)
    {
        $imagesUrl = $this->uploadImages($request->file('images'));
        auth()->user()->article()->create(array_merge($request->all() , [ 'images' => $imagesUrl]));

        return redirect(route('articles.index'));
    }
public function rules()
    {
        if($this->method() == 'POST') {
            return [
                'title' => 'required|max:250',
                'description' => 'required',
                'body' => 'required',
                'images' => 'mimes:jpeg,png,bmp',
                'tags' => 'required',
            ];
        }
        return [
            'title' => 'required|max:250',
            'description' => 'required',
            'body' => 'required',
            'tags' => 'required',
        ];
    }
public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->string('title');
            $table->string('slug');
            $table->text('description');
            $table->text('body');
            $table->text('images')->nullable();
            $table->string('tags');
            $table->integer('viewCount')->default(0);
            $table->integer('commentCount')->default(0);
            $table->timestamps();
        });
    }
protected $fillable = ['title' , 'description' , 'body' , 'tags' , 'images'];
    protected $casts = [
        'images' => 'array'
    ];

ثبت پرسش جدید
میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 5 سال پیش مطرح شد
0

توی متد uploadImage قبل
$filename = $file->getClientOriginalName();
باید چک کنید اگر فایلی وجود داشت این دستور اجرا شه. ارور برای همین خطه
شما فایلی ارسال نمیکنید ولی این خط همچنان میخاد اسمشو بگیره
پس باید یه شرطی قبلش باشه که اگه فایلی وجود داشت این کارو انجام بده


Armin Rahmati
@arminrahmati999 5 سال پیش آپدیت شد
0

@ali.bayat
@juza66
@mohsenbostan
@hossein.r.1442
@hesammousavi
@miladparsi1070
الان این کدو اضافه کردم و درست اجرا میشه

protected function uploadImages($file)
    {

        $year = Carbon::now()->year;
        $imagePath = "/upload/images/{$year}/";
        if (file_exists($imagePath)) {
            $filename = $file->getClientOriginalName();

            $file = $file->move(public_path($imagePath), $filename);

            $sizes = ["300", "600", "900"];
            $url['images'] = $this->resize($file->getRealPath(), $sizes, $imagePath, $filename);
            $url['thumb'] = $url['images'][$sizes[0]];

            return $url;
        }
    }

ولی الان مشکلی که وجود داره اینه که وقتی میخوام پستی رو ویرایش کنم این ارور میاد.

Invalid argument supplied for foreach()
@foreach( $article->images['images'] as $key => $image)
                            <div class="col-sm-2">
                                <label class="control-label">
                                    {{ $key }}
                                    <input type="radio" name="imagesThumb" value="{{ $image }}" {{ $article->images['thumb'] == $image ? 'checked' : '' }} />
                                    <a href="{{ $image }}" target="_blank"><img src="{{ $image }}" width="100%"></a>
                                </label>
                            </div>
                        @endforeach

میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 5 سال پیش آپدیت شد
0

عکسی که میخواین نشون بدین اصلا وجود داره؟ ارور میگه ارتیکلی که میخاین نمایش بدین عکس نداره
شما باید مشخص کنید کدوم ارتکل هاتون عکس دارن و فقط برای اون ها عکس رو نمایش بدین
البته داشتن تصویر برای همه ارتیکل ها رو الزامی کنید راه بهتریه


Armin Rahmati
@arminrahmati999 5 سال پیش مطرح شد
0

@miladparsi1070
بله الان دو تا مقاله اضافه کردم یکی با عکس و یکی بدون عکس.
خب الان همینو میخوام که داخل ویو چی باید بنویسم که اگه عکس داشت نشون بده و اگه نداشت نشون نده.
میخوام یه چیزی مثه سایت ویرگول بسازم به خاطر همین دارم این کارو میکنم.


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 5 سال پیش مطرح شد
0

شما داخل کنترلر وقتی ادرس عکس رو داخل یه متغیر یا ارایه میریزید برای ارتیکل هایی که عکس ندارن میتونید مقدارشو null بزارید و توی ویو چک کنید اگه مقدار اون متغیر مخالف null بود تگ عکس اجرا شه (عکس نشون داده بشه) در غیر این صورت یا کلا چیزی نمایش داده نشه یا یه عکس دیفالت برای ارتیکل های بدون عکس نشان داده بشه


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 5 سال پیش آپدیت شد
0

شما ببین توی دیتابیست توی فیلد عکس برای ارتیکل هایی که عکس ندارن چی نوشته میشه بعد از همون برای گذاشتن شرط توی ویو استفاده کن
برای مثال :

if($article->image != null)
نمایش عکس

Armin Rahmati
@arminrahmati999 5 سال پیش مطرح شد
0

@miladparsi1070
میشه این مراحلو واسم بنویسید؟


میلاد هدایت پور
تخصص : در حال پیشرفت
@miladparsi1070 5 سال پیش آپدیت شد
0
@if(($image_path) != null)
     <img src="{{asset($image_path)}}" id="blah" alt="picture">
  @else
  <img src="{{asset('img/default-user.png')}}" id="blah" alt="picture">
   @endif

شما باید همچین کاری کنید
حالا به جای اون imagepath ها ادرس عکس خودتو بزار
که فک کنم توی کدت این باشه

{{ $image }}

بازم پیشنهاد میدم گذاشتن عکس رو اجباری کنی
نمونه های کامل این کار توی گوگل هست. از اونام استفاده کن


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

با سلام خدمت همه دوستان
من هم همین مشکل رو دارم ولی در سمت بکند حلش کردم و به این صورت نوشتم :

        $lesson = Lesson::create([
            'level' => $request->level,
            'number' => $request->number,
            'name' => $request->name,
            'text' => $request->text,
            'status' => $request->status,
            'image' => $request->has('image') ? url(env('LESSON_IMAGE_UPLOAD_PATH') . $imagelesson) : 'no image',
            'voice' => $request->has('voice') ? url(env('LESSON_IMAGE_UPLOAD_PATH') . $voicelesson) : 'no voice',
        ]);

و مشکلی که الان دارم این هست که میخوام در سمت فرانت هم که از ویو استفاده میکنم همین if رو قرار بدم و formdata فقط زمانی که من مقدار دارم اون رو از من بگیره و در غیر اینصورت خالی نشون بده .

      <q-file
      filled
      v-model="form.image"
      label="آپلود عکس"
      @change="getImage"
      :src=form.image
      />

و در بخش جاوا اسکریپت

    const getImage = (event) => {
      form.image = event.target.files[0];
    };
    const getvoice = (event) => {
      form.voice = event.target.files[0];
    };
    function validate(){
      updatelesson()
    }

    function updatelesson() {

      const formData = new FormData();
      formData.append('id', route.params.id);
      formData.append('level', form.level);
      formData.append('number', form.number);
      formData.append('name', form.name);
      formData.append('text', form.text);
      formData.append('image', form.image);
      formData.append('voice', form.voice);
      formData.append('status', form.status);

      axios
        .post("http://localhost:8000/api/lessons" , formData )
        .then(function (response) {
          console.log(response)

        })
        .catch(function (error) {
          console.log(error);
        });
    }

حالا فهمیدم که مشکل از formdata هست و باید یک if برای اون قسمت بزارم ولی نمیدونم چه طور باید پیاده سازی کنم و بنویسم .
ممنون میشم راهنمایی کنید .
خطای هم که دریافت میکنم .

"Call to a member function extension() on string"

من این کد رو از طریق پستمن (postman) هم امتحان کردم و میدونم که مشکل این formdata هست .


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

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