Загрузить файл через RESTful API? - PullRequest
1 голос
/ 03 августа 2011

Я пытался сделать вызов RESTful API для загрузки видео через метод POST. Чего мне не хватает, так это того, что я не знаю лучших практик написания такого рода API, а также не нахожу в Интернете никаких ресурсов для подражания. Прямо сейчас я делаю это:

Я работаю в PHP и Zend Framework (Zend_Rest_Route).

Первый подход:

с помощью file_get_contents на стороне клиента и отправки его в API с помощью curl, а на стороне сервера с помощью file_put_contents для записи этих данных и отправки соответствующего ответа.

Второе:

используя Zend_File_Treansfer для получения файла на стороне сервера и помещая адрес моей конечной точки API загрузки в zend_form с установкой метода как post. В этом случае файл загружается на сервер, но после отправки формы URL-адрес в адресной строке указывает на сервер API и никогда не возвращается в форму.

Правильно ли я делаю это ?, если нет, дайте мне знать, каковы лучшие практики и как этого добиться.

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Как-то так у меня сработало:

public function postAttachment($fileName, $fileMimetype, $fileContents, $postURL, $username, $password) 
{
    $auth = base64_encode($username . ':' . base64_decode($password));
    $header = array("Authorization: Basic ".$auth);
    array_push($header, "Accept: */*");     
    $boundary =  "----------------------------".substr(md5(rand(0,32000)), 0, 12); 

    $data = ""; 
    $data .= "--".$boundary."\r\n"; 

    //Collect Filedata          
    $data .= "Content-Disposition: form-data; name=\"file\"; filename=\"".$fileName."\"\r\n"; 
    $data .= "Content-Type: ".$fileMimetype."\r\n"; 
    $data .= "\r\n";
    $data .= $fileContents."\r\n"; 
    $data .= "--".$boundary."--";
    // add more parameters or files here

    array_push($header, 'Content-Type: multipart/form-data; boundary='.$boundary);
    $params = array('http' => array( 
       'method' => 'POST', 
       'protocol_version' => 1.1, 
       'user_agent' => 'File Upload Agent',
       'header' => $header, 
       'content' => $data 
    )); 
   $ctx = stream_context_create($params); 
   $fp = fopen($postURL, 'rb', false, $ctx); 

   if (!$fp) { 
      throw new Exception("Problem with ".$postURL." ".$php_errormsg); 
   } 
   $responseBody = @stream_get_contents($fp); 
   if ($responseBody === false) { 
      throw new Exception("Problem reading data from ".$postURL.", ".$php_errormsg); 
   } 
}

Если вы хотите опубликовать несколько файлов или добавить другие параметры, состоящие из нескольких частей, их легко добавить и в другие границы.

Я нашел этот код в другом посте, и вы, вероятно, можете найти подобный код в вики PHP (http://www.php.net/manual/en/function.stream-context-create.php#90411). НО ... Этот код неправильно обрабатывал возврат каретки + перевод строки, и мой сервер кратко отклонил этот постКроме того, более старый код также использовал HTTP версии 1.0 - (который не использует сокеты повторно). При использовании HTTP 1.1 сокеты повторно используются при публикации большого количества файлов. (Это работает и с HTTPS.) Ядобавил мой собственный пользовательский агент - если вы обманываете какой-то сервер, думая, что это сообщение браузера, возможно, вы захотите изменить пользовательский агент, чтобы подделать браузер.

0 голосов
/ 03 августа 2011

вы пытались добавить перенаправление в конец действия вашего контроллера, который обрабатывает загрузку?(если нет, то в действительности рекомендуется перенаправлять после публикации) (убедитесь, что вы перенаправили ПОСЛЕ выполнения вашей логики).По сути, «страница», которая получает данные публикации, должна работать только с данными, и любая информация, которую вы хотите вернуть пользователю об этом действии публикации, должна быть предоставлена ​​им на странице, на которую вы их перенаправили.* [form] - POST -> ['post' action controller] - перенаправление (302) -> [страница с информацией об успехе / неудаче]

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