راکت
حل شده

خطا آپلود فایل لاراول

25 پاسخ

با سلام
وقت بخیر
بنده در لاراول میخوام عملیات آپلود رو انجام بدم ولی با ارور زیر برخورد می‌کنم و مطالبی در موردش پیدا نکردم.
با livewire می‌خوام آپلود رو انجام بدم.
این هم ارور:

Call to a member function getClientOriginalName() on string 

کدهای قسمت کنترلر

$user = new User();
        $user->ip_id = $ip->id;
        $user->name = $this->name;
        $user->email = $this->email;
        $user->password = bcrypt($this->password);
        $photo = $this->photo;
        $photoName = Carbon::now()->timestamp . '.' . $this->photo->extension();
        $this->photo->storeAs('images', $photoName);
        $user->is_activated = 1;
        $user->is_deleted = 0;
        $user->save();

کدهای قسمت ویو(فرم):

<form wire:submit.prevent="store" class="form-horizontal" enctype="multipart/form-data">
            @csrf
            <div class="row">
                <div class="form-group col-md-3">
                    <label class="form-label" for="text-input">نام و نام خانوادگی</label>
                    <input wire:model="name" type="text" id="text-input" class="form-control"
                           placeholder="محمد صالحی">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="email-input">ایمیل (پست الکترونیکی)</label>
                    <input wire:model="email" type="email" id="email-input" class="form-control"
                           placeholder="sample@sample.com">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="password-input">رمز عبور</label>
                    <input wire:model="password" type="password" id="password-input" class="form-control"
                           placeholder="*******">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="role-input">نقش کاربر</label>
                    <select wire:model="roleSelect" id="role" class="form-control">
                        <option>نقش کاربر را انتخاب کنید ...</option>
                        @foreach($roles as $role)
                            <option value="{{ $role->id }}">{{ $role->title }}</option>
                        @endforeach
                    </select>
                </div>
            </div>
            <div class="card-footer">
                <button type="submit" wire:loading.attr="disabled" class="btn btn-success">
                    <i class="fa fa-dot-circle-o"></i>
                    ثبت
                </button>
            </div>
        </form>

لطف می‌کنید بررسی کنید
ورژن لاراول : 6

ثبت پرسش جدید

پاسخ‌ها

25
سبحان مولایی
سبحان مولایی
@websaz

تخصص: برنامه‌نویس وب: Python :: Django :: Node :: Php :: Laravel :: JS :: React :: React Native

بهترین پاسخ

سلام ورژن لایو وایر شما بسیار پایین است ( ورژن لایو وایر در حال حاضر 2.4.4 هست)
و قابلیت استفاده از wire:model در input ها با تایپ فایل در ورژن 1.2.0 اضافه شده است پس شما برای استفاده از این ویژگی و ویژگی های دیگر و بهره بری از امنیت بهتر ورژن لایو وایر رو ( با توجه به این لینک) اپدیت کنید.

@yaskabod73

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

سلام
خود ارور به خوبی بیان میکنه که مشکل از کجاست. getClientOriginalName() رو باید بر روی object که معمولا از request میاد اعمال کنید اما دارید روی string اعمال می کنید. احتمالا داخل کنترلر برای فراخوانی request بر روی file مشکل دارید.
@yaskabod73

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

ممنون از شما جناب @mohaligateway
بنده با request هم تست کردم ولی باز هم همین ارور رو داد؟!

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

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

یکبار dd روی خروجی بگیرید چه چیزی رو نمایش میده ؟
@yaskabod73

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

dd گرفتم خروجی یه آدرس فیک میده:
C:\fackerpath\1.jpg

@mohaligateway

رایموند
رایموند
@Raymond

تخصص: مختصص وردپرس - برنامه نویس لاراول

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

کجای کد ها شما request ها رو دریافت می کنید. کد های بالا رو بررسی کردم برای مورد upload قسمتی وجود نداره. روش upload کردن فایل هاتون مشکل داره احتمالا ببینید این لینکی که دوستمون دادن مشکلتون رو حل می کنه یا نه.
@yaskabod73

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

سلام مجدد خدمت دوستان
بنده روش بالا رو هم تست کردم ولی باز هم همون خطا رو دریافت میکنم.
جناب @mohaligateway بنده عرض کردم با livewire دارم کار می‌کنم و Request ها از طریق wire:model فرستاده می‌شه.
اگر نیاز هست فایل کد ها را آپلود کنم.
ممنون میشم راهنمایی کنید.

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

سلام

شما این متد رو کجا استفاده کردی؟!

getClientOriginalName()

توی این قسمت؟

  $photo = $this->photo;
        $photoName = Carbon::now()->timestamp . '.' . $this->photo->extension();

اگر اره شما باید بجای extension() اینو استفاده کنی getClientOriginalExtension()
میشه

$photo = $this->photo;
$ex = $this->photo->getClientOriginalExtension();
$photoName = Carbon::now()->timestamp . '.' . $ex;
محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

ممنون آقای @juza66
طبق گفته شما عمل کردم. ولی دوباره همون ارور رو داد واقعاً نمیدونم چیکار باید کرد؟!
این هم کدها و ارور:

 Call to a member function getClientOriginalExtension() on string 

کد:

    public function store()
    {
        $this->validate([
            'name' => 'min:5',
            'email' => 'required|unique:users',
            'password' => 'required|min:5',
            'photo.*' => 'image|max:10240' // 1MB Max
        ]);

// Add Info Sys
        $ip = new Ip();
        $ip->ip = $this->info["ip"];
        $ip->browser = $this->info["browser"];
        $ip->operating_system = $this->info["os"];
        $ip->save();

//Add New User
        $user = new User();
        $user->ip_id = $ip->id;
        $user->name = $this->name;
        $user->email = $this->email;
        $user->password = bcrypt($this->password);

        $photo = $this->photo;
        $ex = $this->photo->getClientOriginalExtension();
        $photoName = Carbon::now()->timestamp . '.' . $ex;
        $this->photo->storeAs('images', $photoName);

        $user->is_activated = 1;
        $user->is_deleted = 0;
        $user->save();

// Add Role to User
        $user->roles()->attach($this->roleSelect);

// Photos

        $this->resetInput();
        Session::flash('add_user', 'کاربر با موفقیت اضافه گردید.');
    }
رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

سلام وقتتون بخیر!

اول این کد رو بزن و نتیجه رو برام ارسال کن

return $request->file("photo");

وقتی نتیجه بالا رو گرفتی کد زیر رو تست کن و نتیجه جفتش رو برام ارسال کن

$file=$request->file("photo");
 if ($file){
    $imageName= uniqid() . "." . $file->getClientOriginalExtension();
    $file->move(public_path($path), $imageName);
}
سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

این متغییر رو dd بگیر ببین چی برمیگردونه؟!

$this->photo
moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

داخل form شما قسمتی برای آپلود وجود نداره. یا من پیدا نمی کنم.🤔
@yaskabod73

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

@mohaligateway درسته منم پیدا نمیکنم فرض رو براین گذاشتم که اینپوت فایلش همون نامی هست که توی کدهاش نوشته :)

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

ممنون از دوستان
جناب @mohaligateway کدهای سمت ویو ارسال کردم نگاه کنید ببینید مشکلی داره؟؟؟
کد سمت ویو:

 <form wire:submit.prevent="store" class="form-horizontal" enctype="multipart/form-data">
            @csrf
            <div class="row">
                <div class="form-group col-md-3">
                    <label class="form-label" for="text-input">نام و نام خانوادگی</label>
                    <input wire:model="name" type="text" id="text-input" class="form-control"
                           placeholder="محمد صالحی">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="email-input">ایمیل (پست الکترونیکی)</label>
                    <input wire:model="email" type="email" id="email-input" class="form-control"
                           placeholder="sample@sample.com">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="password-input">رمز عبور</label>
                    <input wire:model="password" type="password" id="password-input" class="form-control"
                           placeholder="*******">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="role-input">نقش کاربر</label>
                    <select wire:model="roleSelect" id="role" class="form-control">
                        <option>نقش کاربر را انتخاب کنید ...</option>
                        @foreach($roles as $role)
                            <option value="{{ $role->id }}">{{ $role->title }}</option>
                        @endforeach
                    </select>
                </div>
            </div>
            <div class="row">
                <div class="form-group col-md-3">
                    <label class="form-label" for="ip-input">آی پی</label>
                    <input type="text" value="{{ $info["ip"] }}" id="ip-input" class="form-control">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="browser-input">مرورگر</label>
                    <input type="text" value="{{ $info["browser"] }}" id="browser-input" class="form-control">
                </div>
                <div class="form-group col-md-3">
                    <label class="form-label" for="os-input">سیستم عامل</label>
                    <input type="text" value="{{ $info["os"] }}" id="os-input" class="form-control">
                </div>
                <div class="form-group col-md-3 mt-md-4">
                    <label class="form-label" for="file-input">بارگذاری تصویر</label>
                    <input wire:model="photo" type="file" id="file-input">
                </div>
            </div>

            <div class="card-footer">
                <button type="submit" wire:loading.attr="disabled" class="btn btn-success">
                    <i class="fa fa-dot-circle-o"></i>
                    ثبت
                </button>
            </div>
        </form>

جناب موسوی dd هم گرفتم و آدرس زیر بر می‌گردونه؟!!! @juza66

"C:\fakepath\01.jpg"

ممنون از آقای پارسیان همون خطای بالا رو میده @Rp76

کدهای کنترلر رو هم گذاشتم شاید اشتباهی رخ داده ممنون میشم چک بفرمایید.

class UserComponent extends Component
{
    public $data;
    public $roles, $roleSelect, $name, $info, $password, $email, $is_activated, $selected_id;
    public $photo;
    public $user_id;

    public $updateMode = false;

    public $isStatus = false;

    public function render()
    {
        $this->data = User::with('roles')->get();
        $this->roles = Role::all();

        return view('livewire.users.component');
    }

    public function mount()
    {
        $geoip = new GeoIPLocation();
        $parsed = new UserAgentParser();
        $parsed = $parsed->parse(\request()->userAgent());
        $this->info = array(
            "ip" => $geoip->getIP(),
            "browser" => $parsed->browser()->name,
            "os" => $parsed->os()->name
        );
    }

    public function status($id)
    {
        $user = User::find($id);
        $this->isStatus = !$this->isStatus;
        if ($this->isStatus) {
            $user->is_activated = 1;
            $user->save();
        }
        if (!$this->isStatus) {
            $user->is_activated = 0;
            $user->save();
        }
    }

    private function resetInput()
    {
        $this->name = null;
        $this->email = null;
        $this->password = null;
        $this->roleSelect = null;
    }

    public function store()
    {
        $this->validate([
            'name' => 'min:5',
            'email' => 'required|unique:users',
            'password' => 'required|min:5',
            'photo.*' => 'image|max:10240' // 1MB Max
        ]);

// Add Info Sys
        $ip = new Ip();
        $ip->ip = $this->info["ip"];
        $ip->browser = $this->info["browser"];
        $ip->operating_system = $this->info["os"];
        $ip->save();

//Add New User
        $user = new User();
        $user->ip_id = $ip->id;
        $user->name = $this->name;
        $user->email = $this->email;
        $user->password = bcrypt($this->password);

//        $photo = $this->photo;
//        $ex = $this->photo->getClientOriginalExtension();
//        $photoName = Carbon::now()->timestamp . '.' . $ex;
//        $this->photo->storeAs('images', $photoName);

        $user->is_activated = 1;
        $user->is_deleted = 0;
        $user->save();

// Add Role to User
        $user->roles()->attach($this->roleSelect);

// Photos

        $this->resetInput();
        Session::flash('add_user', 'کاربر با موفقیت اضافه گردید.');
    }

    public function edit($id)
    {
        $record = User::findOrFail($id);
        $roles = Role::pluck('title', 'id');

        $this->selected_id = $id;
        $this->name = $record->name;
        $this->email = $record->email;
        foreach ($roles as $role) {
            $this->roleSelect = $role;
        }

        $this->updateMode = true;
    }

    public function update()
    {
        $this->validate([
            'selected_id' => 'required|numeric',
            'name' => 'min:5',
            'email' => 'required|email',
            'password' => 'required|min:5',
            'roleSelect' => 'required'
        ]);

        if ($this->selected_id) {
            $record = User::find($this->selected_id);
            $record->name = $this->name;
            $record->email = $this->email;
            $record->password = bcrypt($this->password);
            $record->save();

            if ($this->roleSelect) {
                $record->roles()->sync($this->roleSelect);
            } else {
                $record->roles()->attach($this->roleSelect);
            }

            $this->resetInput();
            $this->updateMode = false;

            Session::flash('update_user', 'کاربر با موفقیت ویرایش گردید.');
        }
    }

    public function destroy($id)
    {
        if ($id) {
            $record = User::where('id', $id);
            $record->delete();
//            $record->update([
//                'is_deleted' => 1
//            ]);
            Session::flash('delete_user', 'کاربر با موفقیت به زباله دان منتقل گردید.');
        }
    }
}
رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

اگر مشکل حل نشده
واتساپ من رو پیدا کن

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

ممنون از شما جناب @Rp76 ، اگه نیاز هست داخل گیت هاب ادتون کنم

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

onam radife!

محمد صالحی
محمد صالحی
@yaskabod73

تخصص: برنامه نویس php

ممنون لطف کردی، اد شدی @Rp76

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

حاجی حله من ۱ ساعت دیگه میرسم شرکت چک میکنم خبرت میکنم

سبحان مولایی
سبحان مولایی
@websaz

تخصص: برنامه‌نویس وب: Python :: Django :: Node :: Php :: Laravel :: JS :: React :: React Native

سلام شما باید این کد

use Livewire\WithFileUploads;

بالای کلاس قرار بدید

و دراولین خط کلاس این

use WithFileUploads;

را اضافه کنید .
@yaskabod73

صفحه 1 از 2

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

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