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

时间:2015-01-09 07:53:41

标签: php jquery ajax api rest

我一直致力于构建API作为学习目的。它本质上是一个类似Twitter的微帖API。除了API,我一直在构建一个基于API的客户端Web应用程序。我能够毫无问题地成功发布状态。但现在我试图允许用户上传图像和帖子。客户端应用程序使用mvc模式构建。我通过jQuery ajax将提交的帖子发布到我的帖子控制器,如:

$.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时遇到了很多困难。我创建了一个类来处理我的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);

以下是我传递以发布纯文字状态的数据:

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

我尝试将$_FILES['file']['tmp_name']作为数组的一部分传递,但在API端,$_FILES数组为null。我尝试了这个example,但我遇到了同样的问题。

我的API设置方式,如果$_SERVER['request_method']POST,我会从cURL获取php://input的内容,然后将这些参数传递给必要的控制器。我是否需要在此处添加任何可以访问$_FILES数组的内容?我现在已经挖了大约3个小时而且找不到任何帮助我的东西,所以我很感激你的帮助。

谢谢!

修改 我不知道这是如何重复,因为您发布的链接是重复的,与通过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来实现它,但这不是很有用,因为我希望用户能够选择他们自己的图像来上传他们的帖子。因此看起来我的问题围绕着获取完整路径,因为该教程在第一个代码块的第4行提及并将其发送到api。那么如何从$_FILES数组而不是静态文件URL获取相同的信息呢?

1 个答案:

答案 0 :(得分:1)

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