cakephp web services如何编写一个允许我上传文件的动作

时间:2012-05-25 06:48:05

标签: json web-services cakephp rest file-upload

我正在使用cakephp 2.1.0

我有一个Post Controller,基本上创建一个id为整数,标题,图像为字符串

的帖子

我有一个控制器操作,可以使用一个视图,允许我上传文件并创建一个新的Post记录。该操作称为admin_add

这很有效。

但是,我想公开此操作admin_add,以便Adobe Flex内置的桌面应用可以调用它。

最好我想使用RESTful操作。

基本上我想将此操作创建为Web服务。

我在网上看到的大多数教程都倾向于仅用于READ的操作,例如视图和索引。

我需要对cakephp应用程序代码进行哪些更改?

3 个答案:

答案 0 :(得分:3)

我过了一段时间才发现它。

假设以下设置

  • Cakephp 2.x
  • 此处的操作对于匿名用户是公开的

步骤1.通过josegonzalez安装Webservice Plugin

步骤1.1。为json设置Router :: parseExtensions

步骤1.2。将“Webservice.Webservice”添加到PostController的组件

步骤1.3。加载插件


步骤2.您需要更改PostController的以下操作

    public function add() { 

    if ($this->request->is('post')) {

        // create new Post -- this will grab the file from the request data
        $newPost = $this->Post->createNew($this->request->data);

        if ($newPost) {
            $this->Session->setFlash(__('Your Post has been saved'));
            // for normal webpage submission
            if (empty($this->request->params['ext'])) {
                $this->redirect('/');                   
            } else {        
                // for json response to Flex client 
                $result = $newPost;
                $error = null;
                $id = null;
            }
        } else {
            $this->Session->setFlash(__('Your Post could not be saved. Please, try again.'));
            // for json response for failure to create
            if (!empty($this->request->params['ext'])) {


                    $result = null;
                    $error = 'Your Post could not be saved.';
                    $id = null;

            }

        }
        // this is for json response via Webservice.Webservice
        $this->set(compact('result', 'error', 'id'));

    }

    }

步骤3.按照此回答here中的说明设置您的Flex代码。这是Flex Actionscript中的how you then retrieve the JSON response


步骤4.你应该期望得到一个由3个变量result,error和id以及cake validationErrors组成的json响应。您可以选择将插件中所述的validationErrors列入黑名单。

答案 1 :(得分:2)

听起来你的Cakephp应用程序或多或少地设置得恰当,但后来才会出现。您现在面临的挑战是让您的Adobe Flex代码将所需数据发布到Cakephp操作网址。我看到你正在使用管理员操作,所以我假设需要用户登录才能访问该操作。我知道MINISCULE flex代码,但你在Flex中需要做的是:

  1. 使用具有管理员权限的用户名/ pw组合将Flex POST发送到您的/ user / login页面,并将响应cookie和会话信息保存到变量中。使用这样的东西:

    var request:URLRequest = new URLRequest(url);
    request.method = "POST";
    request.data = variables; //variables includes username and pw
    try {           
        navigateToURL(request);
    }
    
    catch (e:Error) {
    // handle error here
    }
    
  2. 然后将Flex POST(在请求标头中包含Cookie)添加到您的admin / posts / action中,并将图像数据作为请求的正文(内容)。

  3. 然后你必须在cakephp动作中做的就是取$ this-> data ['body']并将其保存到文件中。

答案 2 :(得分:1)

在您的网站上,您可以制作一个上传文字和图片等的普通表格。

然后,您想从上传图像,只需发送正确的POST信息。

例如,如果您想完全使用来自其他服务器的服务,您可以使用CURL并使用以下代码发送表单数据:

$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => '@/folder/image.jpg'));
curl_setopt($ch, CURLOPT_URL, 'http://website.com/posts/add');
curl_exec($ch);
curl_close($ch);

我不确定Flex是否支持CURL,但它应该有类似的东西。