带有formData的PUT请求无法使用react.js和laravel更新

时间:2019-11-01 11:00:25

标签: reactjs laravel rest api

我没有在通过提取和PUT方法发送的Api端点中接收formdata。

我使用了POST方法,并且得出了我认为不建议更新的方法。 我对在localhost:3000上运行的laravel-API和在localhost:5000上运行的laravel-API做出了反应。

这是API中的路由

Route::put('updateSlide/{id}', 'SlidesController@updateSlide');

这就是控制器中的内容

public function updateImage(Request $request, int $id)

{

    $image = $this->slideRepo->findSlideById($id)->image;


    if ($image) {
        $result = Storage::disk('ucmp')->delete($image);
    }

    if ($request->hasFile('image') && $request->file('image') instanceof UploadedFile) {
        return  $this->slideRepo->saveCover($request->file('image'));

    }        // return response()->json($data);

    // data is an array (note)
    return null;
}


public function updateSlide(Request $request, int $id)
{
    $imageUrl=$this->updateImage($request, $id);

    return response()->json($this->slideRepo->updateSlide([
        'caption' => $request['caption'],
        'image' => $imageUrl,
        'url' => $request['url']
    ],$id));
}

这是发送以提取的功能

export const updateSlideApi = (token, _slide, id) => {
  return {
    url: `${BASE_URL}/api/updateSlide/${id}`,
    opt: API.requestOptions("PUT",token,null,{ body: _slide }, true)
  };
};

我的标题中没有内容类型。

我希望从laravel API函数获得json数据,但出现错误“只能抛出对象”

2 个答案:

答案 0 :(得分:0)

PHP不会解析PUT请求的正文。

使用POST并向参数_method添加值PUT

答案 1 :(得分:0)

PHP放置给了我艰辛的时间,使用此功能将节省您解析其他方法的时间:

function parsePutRequest()
    {
        // Fetch content and determine boundary
        $raw_data = file_get_contents('php://input');
        $boundary = substr($raw_data, 0, strpos($raw_data, "\r\n"));

    // Fetch each part
    $parts = array_slice(explode($boundary, $raw_data), 1);
    $data = array();

    foreach ($parts as $part) {
        // If this is the last part, break
        if ($part == "--\r\n") break; 

        // Separate content from headers
        $part = ltrim($part, "\r\n");
        list($raw_headers, $body) = explode("\r\n\r\n", $part, 2);

        // Parse the headers list
        $raw_headers = explode("\r\n", $raw_headers);
        $headers = array();
        foreach ($raw_headers as $header) {
            list($name, $value) = explode(':', $header);
            $headers[strtolower($name)] = ltrim($value, ' '); 
        } 

        // Parse the Content-Disposition to get the field name, etc.
        if (isset($headers['content-disposition'])) {
            $filename = null;
            preg_match(
                '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', 
                $headers['content-disposition'], 
                $matches
            );
            list(, $type, $name) = $matches;
            isset($matches[4]) and $filename = $matches[4]; 

            // handle your fields here
            switch ($name) {
                // this is a file upload
                case 'userfile':
                    file_put_contents($filename, $body);
                    break;

                // default for all other files is to populate $data
                default: 
                    $data[$name] = substr($body, 0, strlen($body) - 2);
                    break;
            } 
        }

    }
    return $data;
}