使用“multipart/form-data”时,Laravel 4 未收到 Angular $http PUT 数据

Posted

技术标签:

【中文标题】使用“multipart/form-data”时,Laravel 4 未收到 Angular $http PUT 数据【英文标题】:Angular $http PUT data not being received by Laravel 4 when using 'multipart/form-data' 【发布时间】:2013-12-12 00:54:49 【问题描述】:

你好 :) 我正在使用 Laravel 4 中构建的 RESTful API 并结合 Angular 来处理前端的繁重任务。

目的是能够通过将表单数据发布到 API(包括文件)在数据库中创建新的“项目”。用户也可以以相同的方式使用 PUT/PATCH 编辑项目。

无论出于何种原因,我都可以 POST 数据(使用 $http)并且效果很好,但是如果我使用 PUT,Laravel 不会收到任何数据。我也试过补丁。数据肯定是由 $http 发送的,你可以在这里看到:http://paste.laravel.com/1alX/raw

我可以通过回显 $input 变量来判断 Laravel 没有获取/处理任何数据。

我不确定这是 Angular 未以正确方式发送数据的问题,还是 Laravel 未正确接收/处理数据的问题。

Javascript(稍微简化):

var formdata = new FormData();
// Unfortunately we cant just walk through the data with a FOR because the data is an object, not an array – We have to be explicit
// If data exists THEN add data to FormData ELSE do nothing
formdata.append('title', $scope.item.title);
formdata.append('description', $scope.item.description);
formdata.append('image', $scope.item.image);
formdata.append('tags', $scope.item.tags);
formdata.append('priority', $scope.item.priority);


edititem: function(formdata) 
    // Edits a particular list
    // id: the ID of the list to edit
    // data: the edited list object
    var promise = $http(
            method: 'PUT',
            url: 'http://mamp.local/api/v1/items/64',
            headers:  'Content-Type': undefined ,
            data: formdata,
            transformRequest: angular.identity
        )
        .error(function(data, status, headers, config) 
            debug(data, 'API FAIL - edit item');
            return data;
        )
        .success(function(response)
            debug(response.data, 'API Success - edit item');
            return response.data;
        );

    return promise;
,

PHP:

/**
* Update the specified resource in storage.
*
* @param  int  $id
* @return Response
*/
public function update($id)

    // Try and store the new List
    $item = $this->itemRepo->updateitem($id, $this->user, Input::all());

    // Lets check if we have any validation errors
    if (count($item->errors()))
    
        return Response::json(['errors' => $item->errors()->all()], 400);
    
    // No errors
    else
    
        return Response::json(['id' => $item->id], 200);
    



/**
* Updates the item
*
* @param int $id the item ID
* @param User $user
* @param array $input
*
* @return item the item
*/
public function updateitem($id, User $user, $input)

    // Grab the item
    $item = $this->finditem($id, $user);

    // Fill item with new input
    $item->fill($input);

    // Do we have an image?
    if (Input::hasFile('image'))
    
        // Handle resizing of the image
        $item->image = $this->imageManipulator->resize($this->imageSizes, $this->imageDir, Input::file('image'));
    

    // Try and save the item
    if ($item->save())
    
        // item saved, save the tags
        $this->tagRepo->saveTags($input['tags'], $item, $user);
    

    // Return the item
    return $item;

我希望这是足够的信息,如果需要澄清任何事情,请告诉我。

范酷! :)

【问题讨论】:

你能断言 Request::isJson() 是假的吗?丢失输入的最常见原因是 JSON 输入覆盖 POST 数据,反之亦然。 我没有太多时间深入研究这个问题,但是您可以使用休息客户端来测试问题是在客户端还是服务器端。我用chrome.google.com/webstore/detail/postman-rest-client/…。 【参考方案1】:

你为什么这样做:headers: 'Content-Type': undefined

应该是headers: 'Content-Type': 'application/json'

如果 Laravel 没有将 Content-Type 视为 application/json,它将无法正确抓取您的 json 帖子。

【讨论】:

顺便说一句,您的粘贴链接已损坏。 嗯,这是因为他在尝试multipart/form-databoundary。没有别的了。

以上是关于使用“multipart/form-data”时,Laravel 4 未收到 Angular $http PUT 数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 multipart/form-data 时不能正确发送带有 Unicode 的 POST 名称?

为啥在使用 multipart/form-data 时不能正确发送带有 Unicode 的 POST 名称?

使用“multipart/form-data”时,Laravel 4 未收到 Angular $http PUT 数据

使用 RestSharp 在 multipart/form-data POST 中包含文件时遇到问题

Multipart/form-data in 表示时如何获取其他类型字段

使用 iOS FBSDK v4 (multipart/form-data) 上传到 facebook 时编码视频的正确方法