رافق مجتهدزاده
3 سال پیش توسط رافق مجتهدزاده مطرح شد
7 پاسخ

ذخیره نام فایل ذخیره شده در public در دیتابیس لاراول

سلام
من در مورد این مشکل چند جا رو از جمله سایت راکت رو دیدم. منتها جوابهایی که بوده مشکل بنده رو حل نمی کرده. برای همین یه تاپیک جدید زدم.
من اطلاعاتم از جمله یک تصویر رو از یک فرم ساده دریافت می کنم و توسط Teacher::create($request->all()); تو دیتابیس ذخیره می کنم. من می خوام برای انتقال فایل ها به پوشه public از move استفاده کنم. تو این زمینه هم مشکلی نداشتم و فایل رو توی پوشه مخصوصش توی public انتقال می دم. اما توی دیتابیس فیلد pic رو درست ذخیره نمی کنه و آدرس موقت رو ذخیره می کنم.
من می خوام بدونم چطوری می تونم متغیر @request رو از نو مقداردهی کنم و بعد create بزنم. یعنی می خوام بدونم چطوری می تونم متغیر $request رو قبل از اینکه برای ذخیره ارسال کنم ویرایش کنم و مسیری که می سازم رو جایگذاری کنم؟
البته می دونم می تونم یک به یک متغیرها رو با create مقدار دهی کنم اما چون ممکنه تعداد متغیرهام زیاد باشه و مداوم کار مشابه رو انجام خواهم داد نمی خوام یک به یک فیلدها رو مقداردهی کنم و می خوام از all استفاده کنم.
ممنون می شم راهنمایی کنید. تا اینجا هم متد ذخیره م توی کنترلر اینطوریه:

public function store(Request $request)
    {
        $this->validate($request,[
            'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
        ]);
        if ($request->hasFile('pic')){
            $patch = 'images/teacherPic';
            $file = $request->file('pic');
            $uniqueId = uniqid();
            $fileName = $uniqueId."-".$file->getClientOriginalName();
            $file->move(public_path($patch),$fileName);
            $request->get('pic',$patch."/".$fileName);
            $request->input('pic');
        }
        dump($request->all(['pic']));
        $data = Teacher::create($request->all());
        if($data){
            return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);
        };

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 3 سال پیش مطرح شد
2
    public function store(Request $request)
    {
        $this->validate($request,[
            'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
        ]);

        $data = $request->except('pic');

        if ($request->hasFile('pic')) {

            $patch = 'images/teacherPic';

            $file = $request->file('pic');

            $uniqueId = uniqid();

            $fileName = $uniqueId."-".$file->getClientOriginalName();

            $file->move( public_path($patch), $fileName );

            $data['pic'] = $patch. '/' . $fileName; 
        }

        $data = Teacher::create($data);

        return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);

    }

Hamid Reza Niakan
@hamid.niakan1993 3 سال پیش مطرح شد
1

@rafig.xiyavi

public function store(Request $request)
{
    $this->validate($request, [
        'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
    ]);

    $data = new Teacher(); //  new object form model 
    $data->fill($request);
    $data->save();

    if($request->hasFile('pic')) {
        $file = $request->file('pic');
        $path = $file->store('teacher','public');
        $data->pic = $path;
        $data->save();
    }

    if($data) {
        return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);
    }
}

شما باید فیلد pic در migration جدول teacher قرار دهید


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 3 سال پیش مطرح شد
1

نیازی نیست ریکوئست رو از نو جایگذاری کنی از یه ارایه استفاده کن
همه مقادیر مورد نظر رو به جا بریز تو ارایه بعد مقدار ادرس عکس رو هم در ادامه تو ارایه ذخیره کن
بعد ارایه رو به متد createبده


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
1

با سلام. روش های متنوعی هست که میتونید کاری که میخواین انجام بدین. ( به عنوان تغییر آرایه ریکوئست در لاراول سرچ بزنید)

یک روش این هست که کل آرایه ریکوئست رو در یک آرایه جدید مثلا Data ذخیره کنید و بعد با کلید آرایه مقدار مورد نظر رو تغییر بدید و سپس آرایه رو به متد Create تحویل بدید:

$data = $request->all();
$data['your-image-key'] = $path;
Model::create($data);

یا اینکه از متد merge روی ریکوئست دریافتی استفاده کنید. که نمونش در سایت لاراکست توضیح داده شده که به نظرم راه خوانا تر و تر و تمیز تری هست :)

موفق باشید


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 3 سال پیش مطرح شد
2
    public function store(Request $request)
    {
        $this->validate($request,[
            'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
        ]);

        $data = $request->except('pic');

        if ($request->hasFile('pic')) {

            $patch = 'images/teacherPic';

            $file = $request->file('pic');

            $uniqueId = uniqid();

            $fileName = $uniqueId."-".$file->getClientOriginalName();

            $file->move( public_path($patch), $fileName );

            $data['pic'] = $patch. '/' . $fileName; 
        }

        $data = Teacher::create($data);

        return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);

    }

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

@SobhanDadkhah

سلام

ببخشید اون که نوشتی your-image-key منظورت چیه؟


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 3 سال پیش آپدیت شد
1

@oxbir
سلام. کلید آرایه هست. بصورت کلی توی لاراول $request یک ابجکت از کلاس Illuminate/http/Request هست . وقتی شما متد all رو روش صدا میزنید کل ریکوئست های ارسال شده به کنترلر رو بصورت آرایه برمیگردونه.

$data = $request->all();

// محتویات آرایه شامل همه پارامتر های موجود در ریکوئست
$data = [
"_csrf" => "asdasdasd"
"name" => "john"
"family" => "doe"
"image/picture/pic/..." => "upladed image"
];

در واقع کلید آرایه همون ویژگی name هست که برای اینپوت ها توی فرم تعریف میشه. یک نفر ممکن هست اسم اینپوت رو image گذاشته باشه یک نفر picture و ... .
اینطوری با دسترسی به هر عنصر از آرایه با کلیدش میتونید مقادیر ریکوئست رو ویرایش کنید.
موفق باشید 😎


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

@SobhanDadkhah

ممنون از پاسختون

یه مشکلی من دارم در این لینک


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

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