将图像从客户端 Web 应用程序上传到 RESTful API

Upload image from client web application to RESTful API

我一直致力于构建 API 作为学习目的。它本质上是一个类似 twitter 的微博 post API。除了 API,我一直在构建一个由 API 供电的客户端 Web 应用程序。我能够毫无问题地成功 post 状态。但现在我试图让用户上传一张图片以及 post。客户端应用程序是使用 mvc 模式构建的。我 post 通过 jQuery ajax 将 post 提交到我的 post 控制器,如下所示:

$.ajax({
            url: '../../posts/newPost',
            type: 'POST',
            data: formData,
            async: true,
            success: function (data) {
                console.log(data);
                $('#post-form-area').removeClass('loading');
                $('#post-body').val('');
                $('#files').val('');
                $('#attached').find('img').remove();
                $('#attached').hide();

            },
            cache: false,
            contentType: false,
            processData: false
        });

我能够使用控制器中的 $_FILES 数组成功获取文件数据。但是,我很难弄清楚如何将其发送到我的 RESTful API。我创建了一个 class 来处理我的 API 调用,这里是我的 POST 方法的代码:

$ds = json_encode($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $ds);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//execute the request
$result = curl_exec($ch);

这是我传递给 post 纯文本状态的数据:

$data = array('user_id' => $_SESSION['user_id'], 'body' => $body, 'time' => $timestamp);

我尝试将 $_FILES['file']['tmp_name'] 作为数组的一部分传递,但在 API 一侧 $_FILES 数组为空。我尝试遵循此 example,但遇到了同样的问题。

我的 API 的设置方式,如果 $_SERVER['request_method']POST 我从 php://input 得到 cURL 的内容然后传递这些参数到必要的控制器。我是否需要在此处添加任何内容才能访问 $_FILES 数组?我已经挖掘了大约 3 个小时,但没能找到任何对我有帮助的东西,所以我很感激任何帮助。

谢谢!

编辑: 我不明白这是怎么重复的,因为 link 你 post 认为它是重复的,与通过 RESTful 服务上传图像无关...

编辑 2: 我已将范围缩小到如何从我的客户端应用程序发送数据,因为我能够成功地使用以下命令行代码上传文件:

curl -X POST -F "image=@test.JPG" http://rest.mattaltepeter.com/posts/upload

然后是接收代码:

public function uploadAction() {

        $result['success'] = move_uploaded_file($_FILES['image']['tmp_name'], SITE_ROOT . '/uploads/' . $_FILES['image']['name']);
        $result['data'] = UPLOAD_DIR . $_FILES['image']['name'];
        return $result;
    }

我遇到了 this tutorial 并且能够通过对图像的静态 URL 很好地实现它,但这不是很有帮助,因为我希望用户能够 select 自己的图片与 post 一起上传。所以看起来我的问题是围绕获取完整路径,正如该教程在第一个代码块的第 4 行提到的那样,并将其发送到 api。那么如何从 $_FILES 数组而不是静态文件 URL 中获取相同的信息?

终于想通了。它与使用 json_encode() 发送我的 POST 数据有关。当我尝试使用 json_encode() 时,我就可以访问 $_FILES 数组。我想我必须向我的 ApiCall->post() 方法添加一个参数来告诉它我是否想要 json_encode() 我希望传递的数据。