۱۹ Mahdi
خطا در ذخیره اطلاعات
جامعه لاراول ایجاد شده در ۳۰ آذر ۱۴۰۱

سلام

    public function store(Request $request)
    {
        $path = Storage::putFile('contracts', $request->url);
        $request->merge([
            'url' => $path
        ]);
        $request->user()->videos()->create($request->all());
        return redirect()->route('index')->with('success', __('message.store'));
    }

آدرسی ک در دیتابیس ذخیره میشه به شکل زیر

C:\\xampp\\tmp\\php4632.tmp

C:\\xampp\\tmp\\phpAE75.tmp

C:\\xampp\\tmp\\php5813.tmp

کجای کارم اشتباهه؟

     public function store(Request $request)
    {
        $path = Storage::putFile('contracts', $request->url);
        $url = Storage::url($path);
        $request->merge(['url' => $url]);
        $request->user()->videos()->create($request->all());
        return redirect()->route('index')->with('success', __('message.store'));
    }

url هم ک میدیم ادرس به شکل قبلی ذخیره میشه

C:\\xampp\\tmp\\php1545.tmp

Mahdi ۳۰ آذر ۱۴۰۱، ۱۷:۵۱

سلام مهدی عزیز

برای آپلود باید متد file رو هم ثدا بزنید.

$path = Storage::putFile('avatars', $request->file('avatar'));

از requestو کلید url یه دامپ بگیر ببین مقادیر به درستی ارسال میشه.

احمدرضا فاطمی کیا ۳۰ آذر ۱۴۰۱، ۱۸:۰۷

احمد جان تا قبلا از ذخیره در دیتابیس ادرس هیچ مشکلی نداره خروجی دوتا هم یکیه

$path = Storage::putFile('contracts', $request->url);
$path = Storage::putFile('contracts', $request->file('url'));

ولی هنگام merge ادرس خراب میشه

$path = Storage::putFile('contracts', $request->url);
        $o = $request->merge(['url' => $path]);
        dd($o);

خروجی dd

  #session: Illuminate\\Session\\Store {#403 ▼
    #id: "EHUWi9XQtBMpk78JRvddztAZMNxpYfZXpBvW8C22"
    #name: "laravel_session"
    #attributes: array:4 [▼
      "_token" => "A6nePG9MQ1Dii1IGF6tXgzFp33pAxi5ej0DTp38n"
      "_flash" => array:2 [▶]
      "_previous" => array:1 [▶]
      "login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d" => 1
    ]
    #handler: Illuminate\\Session\\FileSessionHandler {#397 ▼
      #files: Illuminate\\Filesystem\\Filesystem {#163}
      #path: "C:\\Users\\LENOVO\\Desktop\\WorkShop\\video-share2\\storage\\framework/sessions"
      #minutes: "120"
    }
    #serialization: "php"
    #started: true
  }
Mahdi ۳۰ آذر ۱۴۰۱، ۱۸:۳۶

مهدی جان

چرا merge انجام میدی؟!

اینطوری کن:

$request->url=$path;
احمدرضا فاطمی کیا ۳۰ آذر ۱۴۰۱، ۱۹:۲۸

احمد جان فاییده ای نکرد در این حالت هم ادرس درست ذخیره نمیشه


Mahdi ۳۰ آذر ۱۴۰۱، ۱۹:۳۵

احمدجان الان دیدن ادامه دوره با این مشکل امکان پذیر نیس ....

Mahdi ۰۱ دی ۱۴۰۱، ۰۵:۴۴

مهدی عزیز

اول از request یه دامپ بگیر مقادیر ارسالی رو چک کن معتبر باشند.

dd($request->all());


name اینپوت مدنظر هم file هست.

احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۰۷:۰۷

احمدجان مشکل از جایی دیگس

نام اینپوت من url و dd هم تا دلت بخواد گرفتم و مشکلی نبود ادرس به ما درست میده

مشکل وقتی پیش میاد ک در دیتابیس اطلاعات ذخیره میشه

روش‌های دیگه برای ذخیره path هست ولی من میخوام به روش استاد سامی برم

و این خطا و پاسخ‌های نادرست سرعتم گرفته

بنا دارم تا اخر ما دوره رو تموم کنم برای بازار کار ولی با این شرایط فکر نکنم حالا حالا بتونم دوره رو به اتمام برسونم

اقای گازری یا موحد یا کسی دیگه نیس برای پاسخگویی؟


Mahdi ۰۱ دی ۱۴۰۱، ۰۷:۱۸

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

به سایر منتورها هم اطلاع دادم جهت بررسی.

چون که url مرج نمیشه توی دیتابیس آدرس tmp ذخیره میشه.

مشکل توی مرج کردن url هست.

$path = Storage::putFile('contracts', $request->file('url'));
$request->url=$path;
dd($request->all());


احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۰۷:۵۳

احمد جان merge ک طبق اموزش استاد استفاده کردم

$path = Storage::putFile('', $request->url);
$request->url=$path;
dd($request->all());

result

  "_token" => "QZ3FCPyjKbjGgSEawiu9YtPhCaPFCLGp8d7E6wHE"
  "name" => "mahdi"
  "length" => "500"
  "slug" => "لباس5hhhhhhhhhhhhhh"
  "thumbnail" => "https://www.eligasht.com/Blog/wp-content/uploads/2017/05/historical-takhte-jamshyd.jpg"
  "category_id" => "1"
  "description" => "hhhhhhhhhhhhhhhhhhhhh"
  "url" => Illuminate\\Http\\UploadedFile {#415 ▼
    -test: false
    -originalName: "آی تی (IT) یا فناوری اطلاعات چیست؟ 7 دلیل برای انتخاب رشته IT.mp4"
    -mimeType: "video/mp4"
    -error: 0
    #hashName: "eaCFBg6eTS9B4Yzrr9D9krzfAdtfedHmmRW7QYPn"
    path: "C:\\xampp\\tmp"
    filename: "php73B8.tmp"
    basename: "php73B8.tmp"
    pathname: "C:\\xampp\\tmp\\php73B8.tmp"
    extension: "tmp"
    realPath: "C:\\xampp\\tmp\\php73B8.tmp"
    aTime: 2022-12-22 04:34:22
    mTime: 2022-12-22 04:34:21
    cTime: 2022-12-22 04:34:21
    inode: 2251799814266926
    size: 18719582
    perms: 0100666
    owner: 0
    group: 0
    type: "file"
    writable: true
    readable: true
    executable: false
    file: true
    dir: false
    link: false
    linkTarget: "C:\\xampp\\tmp\\php73B8.tmp"
  }
]

قسمت ک در url ذخیره میشه

pathname: "C:\\xampp\\tmp\\php73B8.tmp"

اینه ک در دیتابیس ذخیره میشه

Mahdi ۰۱ دی ۱۴۰۱، ۰۸:۰۷

مهدی عزیز

وقتی مقدار یکی از فیلدهای ریکوئست بصورت فایل باشه مرج کردن اون روی مقدارش توی request->all تاثیری نمیزاره

راه اول:

$request->user()->videos()->create($request->except('url') + ['url' => $path]);

راه دوم:

$request->user()->videos()->create(
    array_merge($request->except('url'), ['url' => $path])
);


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

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

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

احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۰۹:۱۰

سلام مجدد احمدجان

خدا رو شکر ک به نتیجه رسیدیم

حالا داستان چیه که برا استاد با request->all مشکلی پیش نمیاد الله اعلم

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

در مورد تندی هم در وحله اول معذرت چون سطح توقعم از 7لرن خیلی بالاس و در ثانی شما هم ما رو درک کن من با دوره php شروع کردم و تایم زیادی ک دارم کار میکنم در خونه بدون هیچ منبع درامدی

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

Mahdi ۰۱ دی ۱۴۰۱، ۰۹:۳۶

مهدی عزیز

عجله در دوره فایده نداره

باید سعی کنی مهارتت رو ارتقا بدی

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

بنظرم سعی کن تمرکزت بیشتر روی ارتقای مهارت باشه

با تمام کردن دوره زودتر از زمان مورد نیاز برای یادگیری ضرر میکنی.

استاد سامی اومدن path رو در url گذاشتن، در ویدیوی استاد داخل url فایلی آپلود نمیشه بلکه اسم فیلد file هست، بخاطر همین merge هم صورت میگیره

اما شما اومدی اینپوت url رو برای آپلود انتخاب کردی و دیگه url داخل request->all یک تکست نیست و یک فایل قرار گرفته.

احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۰۹:۴۷

احمدجان این تیکه رو متوجه نشدم

استاد سامی اومدن path رو در url گذاشتن، در ویدیوی استاد داخل url فایلی آپلود نمیشه بلکه اسم فیلد file هست، بخاطر همین merge هم صورت میگیره

اما شما اومدی اینپوت url رو برای آپلود انتخاب کردی و دیگه url داخل request->all یک تکست نیست و یک فایل قرار گرفته.


استاد ی input با type=file ایجاد کردن با name=file

مشخصات اینپوت من هم دقیقا همین بوده منتهی با name=url

Mahdi ۰۱ دی ۱۴۰۱، ۱۰:۰۳

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

احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۱۰:۰۸

مهندس منم همین کار رو کردم

شما وقتی به شکل زیر

$path = Storage::putFile('contracts', $request->url);

putFile میکنی بعد از اینکه فایل در stoage قرار گرفت ی مسیر بتون برمیگردونه که اون در دیتابیس قرار میدیم

Mahdi ۰۱ دی ۱۴۰۱، ۱۰:۴۱

تفاوت در همینجاست که شما بجای name=file مقدار name رو برابر url قرار دادی

اگر name=file میذاشتی مقدار url رو میتونستی merge کنی و مشکلی نبود و اونجا اگر میخواستی file رو مقدار دیگری merge کنی به همین مشکل اینجا برمیخوردی

وقتی اینپوت فایل رو name=url میذاری مقدار url دیگه مقادیر آپلود فایل قرار میگیره که مرج نمیشه.

مسئله مقادیری هست که داخل request قرار میگیره. برای اینکه بیشتر متوجه تغییرات بشی name رو برابر یک مقدار دیگه قرار بده مثلا name=test بعد میتونی مثل همون راه استاد انجام بدی و merge هم صورت میگیره:

$path = Storage::putFile('contracts', $request->test);
$request->merge([
            'url' => $path
        ]);


بهترین پاسخ
احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۱۰:۵۶

پس این رو باید بزاریم به حساب باگ لاراول

چون استاد گفتن هر اسمی برای اینپوت بزاری مشکلی نیس url رو گذاشتم

Mahdi ۰۱ دی ۱۴۰۱، ۱۲:۴۷

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

فریمورک چارچوبی برای ما تعیین میکنه که ما ملزم به رعایت اون هستیم تا پروژه بهتر جلو بره.

احمدرضا فاطمی کیا ۰۱ دی ۱۴۰۱، ۱۳:۳۸