Поддерживает ли Luracast Restler формат multipart / form-data? - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть пример класса Рестлера:

   class Author {
      ....

      function post($request_data=NULL) {
         var_dump($request_data);
         var_dump($_FILES);
         var_dump($_REQUEST);

         return $this->dp->insert($this->_validate($request_data));
       }

      ....
  }

Я пытаюсь отправить файл и некоторые данные в службу Restler с помощью простой формы HTML:

  <FORM action="http://host/index.php/author" enctype="application/x-www-form-urlencoded" method="post">
      Name:  <INPUT type="text" name="name" value="dima"><BR>
      Email: <INPUT type="text" name="email" value="dima@prot.lt"><BR>
      File:  <INPUT type="file" name="files"><BR> 
      <INPUT type="submit" value="Send"> <INPUT type="reset">
  </FORM>

Понятно, что массив $_FILES будет пустым, но $_REQUEST и $request_data будут иметь три переменные: name = "dima", email = "dima@prot.lt" и file = "selected file name".

В следующем тесте я изменил значение enctype формы на multipart / form-data.

  <FORM action="http://host/index.php/author" enctype="multipart/form-data" method="post">
      Name:  <INPUT type="text" name="name" value="dima"><BR>
      Email: <INPUT type="text" name="email" value="dima@proto.lt"><BR>
      File:  <INPUT type="file" name="files"><BR> 
      <INPUT type="submit" value="Send"> <INPUT type="reset">
  </FORM>

Когда я нажимаю кнопку отправки, в массиве $_REQUEST я вижу те же три переменные, массив $_FILES будет заполнен информацией загруженного файла, НО массив $request_data 1023 * будет пусто !!

Кто-нибудь может помочь в этой ситуации? Где я допустил ошибку?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Я решил эту проблему, написав плагин Restler, может быть у других будет такая же проблема:

<?php

/**
 * URL Encoded String in multipart data format
 * @category   Framework
 * @author     Dmitrij Orlov <dmitrij.orlov@gmail.com>
*/
class UrlMultipartFormat implements iFormat
{
    const REQUEST_MIME      = 'multipart/form-data';
    const RESPONCE_MIME     = 'application/json';
    const EXTENSION         = 'post';

    public function getMIMEMap() {
        return array(self::EXTENSION=>self::REQUEST_MIME);
    }

    public function getMIME(){
        return self::RESPONCE_MIME;
    }

    public function getExtension(){
        return self::EXTENSION;
    }

    public function setMIME($mime){
        //do nothing
    }

    public function setExtension($extension){
        //do nothing
    }

    public function encode($data, $human_readable=FALSE){
        return $human_readable ? 
        $this->json_format(json_encode(object_to_array($data))) : 
        json_encode(object_to_array($data));
    }

    public function decode($data){
        return $_REQUEST;
    }

    public function __toString(){
        return $this->getExtension();
    }

    /**
     * Pretty print JSON string
     * @param string $json
     * @return string formated json
     */
    private function json_format($json)
    {
        $tab = "  ";
        $new_json = "";
        $indent_level = 0;
        $in_string = FALSE;

        $len = strlen($json);

        for($c = 0; $c < $len; $c++) {
            $char = $json[$c];
            switch($char) {
                case '{':
                case '[':
                    if(!$in_string) {
                        $new_json .= $char . "\n" . 
                        str_repeat($tab, $indent_level+1);
                        $indent_level++;
                    } else {
                        $new_json .= $char;
                    }
                    break;
                case '}':
                case ']':
                    if(!$in_string) {
                        $indent_level--;
                        $new_json .= "\n".str_repeat($tab, $indent_level).$char;
                    } else {
                        $new_json .= $char;
                    }
                    break;
                case ',':
                    if(!$in_string) {
                        $new_json .= ",\n" . str_repeat($tab, $indent_level);
                    } else {
                        $new_json .= $char;
                    }
                    break;
                case ':':
                    if(!$in_string) {
                        $new_json .= ": ";
                    } else {
                        $new_json .= $char;
                    }
                    break;
                case '"':
                    if($c==0){
                        $in_string = TRUE;
                    }elseif($c > 0 && $json[$c-1] != '\\') {
                        $in_string = !$in_string;
                    }
                default:
                    $new_json .= $char;
                    break;
            }
        }

        return $new_json;
    }

}

?>
0 голосов
/ 16 декабря 2011

Restler v2.1 и ниже не поддерживает multipart/form-data, так как мы сосредоточены на создании API. Но мы открыты для идей и рассмотрим возможность добавления их в будущие версии.

Нет ничего плохого в использовании $_REQUEST и $_FILES непосредственно в вашей функции, и в настоящее время это единственная возможность получить данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...