json
3 سال پیش توسط json مطرح شد
5 پاسخ

ارسال عکس از ری اکت به لاراول

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

کنترلر:

// اطلاعات تصویر آپلود شده رو میگیرم
        $imageData = decodeBase64File($request->image);
        $extension = $imageData['ext'];
        $file = $imageData['file'];
        $size = $imageData['size'];

        // اسم فایل رو انتخاب میکنم
        $imageName = 'uploaded_image_' . time() . $extension;

        // فایل رو یه جایی که میخوام ذخیره می کنم 
        Storage::disk('public')->put('images/' . $imageName, $file);

        $file = str_replace(' ', '+', $request->image);
        $file = substr($file, strpos($file, ';base64,') + 8);
        $decodedFile = base64_decode(json_encode($file));

هلپر برای دیکود کردن تصویر:

function decodeBase64File( $encodedFile )  
{  
// اینجا اطلاعات اضافی رو پاک میکنم تا کد اصلی رو بگیرم  
$file = strreplace(' ', '+', $encodedFile );  
$file = substr( jsonencode($file), strpos(jsonencode($file),';base64,' ) + 8 );  
$decodedFile = base64decode($file);

 // با کمک توابع پی اچ پی، مشخصات فایل رو بررسی می کنم      
 $fileMimeType = finfo_buffer( finfo_open() , $decodedFile , FILEINFO_MIME_TYPE );   
 $fileExt = substr($fileMimeType, strpos($fileMimeType,'/')+1);      

 return [         
      'file' => $decodedFile, // فایل آماده برای ذخیره سازی در دیسک         
      'mime'  => $fileMimeType, // نوع فایل        
      'ext'   => $fileExt, // اکستنشن فایل         
      'size'  => (int)strlen( $decodedFile ) // حجم فایل با واحد بایت     
 ]; 

}

این هم فرانت:

 formData.append('image',event.target.image.files[0]);
            formData.append('img_title',img_title);
        console.log(event.target.image.files[0]);

        await axios.post(
            'http://127.0.0.1:8000/api/v1/villa/store/saveImg/25',
         formData
    )
          .then(function (response) {
            console.log(response.data);
          })
          .catch(function (error) {
            console.log(error);
          });

    }

jsx:

<form  onSubmit={e => updateData(e)}>

            <input type="file" name="image"
             />
            <input type="text" name="img_title" value={img_title}
                         onChange={e => setImgTitle(e.target.value)}

/>

                <button>Update</button>
            </form>

روش راحتتری نیست برای ذخیره این نوع تصاویر؟
ممنون میشم راهنمایی کنید


ثبت پرسش جدید
json
تخصص : آزاد
@JSON 3 سال پیش آپدیت شد
مصطفی خراشادی زاده
@safakh 3 سال پیش مطرح شد
0

سلام @shirzad
خروجی این کد رو هم قرار بدید

dd($request->image);

json
تخصص : آزاد
@JSON 3 سال پیش مطرح شد
0

@safakh
خالیه متاسفانه {}
انگار چیزی ارسال نمیشه به سرور...
در حالی که وقتی توی فرانت لاگ میگیرم میتونم دیتای تصویر رو ببینم
حالا اگه بصورت معمولی ذخیره کنم میشه؟؟یعنی همون حالتی که بدون api تصاویر رو ذخیره میکنم؟


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش مطرح شد
0

اینو اضاف کن به فرم بعد تست بگیر

enctype="multipart/form-data"

مهدی مهدوی
تخصص : تازه وارد
@mehdi.mahdavi97 3 سال پیش آپدیت شد
1

سلام
@shirzad

 headers: {
        'Content-Type': 'multipart/form-data',
      }

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

await axios.post('http://127.0.0.1:8000/api/v1/villa/store/saveImg/25', formData, {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    })

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

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