سلام خدمت دوستان
من میخوام آپلود عکس اختیاری باشه، وقتی عکس آپلود میکنم مشکلی پیش نمیاد ولی وقتی عکس آپلود نمیکنم، ارور زیر نمایش داده می شود.
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'
];
توی متد uploadImage قبل
$filename = $file->getClientOriginalName();
باید چک کنید اگر فایلی وجود داشت این دستور اجرا شه. ارور برای همین خطه
شما فایلی ارسال نمیکنید ولی این خط همچنان میخاد اسمشو بگیره
پس باید یه شرطی قبلش باشه که اگه فایلی وجود داشت این کارو انجام بده
@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
بله الان دو تا مقاله اضافه کردم یکی با عکس و یکی بدون عکس.
خب الان همینو میخوام که داخل ویو چی باید بنویسم که اگه عکس داشت نشون بده و اگه نداشت نشون نده.
میخوام یه چیزی مثه سایت ویرگول بسازم به خاطر همین دارم این کارو میکنم.
شما داخل کنترلر وقتی ادرس عکس رو داخل یه متغیر یا ارایه میریزید برای ارتیکل هایی که عکس ندارن میتونید مقدارشو null بزارید و توی ویو چک کنید اگه مقدار اون متغیر مخالف null بود تگ عکس اجرا شه (عکس نشون داده بشه) در غیر این صورت یا کلا چیزی نمایش داده نشه یا یه عکس دیفالت برای ارتیکل های بدون عکس نشان داده بشه
شما ببین توی دیتابیست توی فیلد عکس برای ارتیکل هایی که عکس ندارن چی نوشته میشه بعد از همون برای گذاشتن شرط توی ویو استفاده کن
برای مثال :
if($article->image != null)
نمایش عکس
@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 }}
بازم پیشنهاد میدم گذاشتن عکس رو اجباری کنی
نمونه های کامل این کار توی گوگل هست. از اونام استفاده کن
با سلام خدمت همه دوستان
من هم همین مشکل رو دارم ولی در سمت بکند حلش کردم و به این صورت نوشتم :
$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 هست .
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟