2011-08-03 537 views
1

我試圖通過POST方法進行RESTful API調用來上傳視頻。我缺乏的是,我不知道寫這種API的最佳實踐,也沒有在互聯網上找到任何資源需要遵循。現在我正在這樣做:通過RESTful API上傳文件?

我正在使用PHP和zend框架(Zend_Rest_Route)。

第一種方法:

在客戶端使用的file_get_contents和POST它使用捲曲API,並且在服務器側使用file_put_contents編寫數據和發送適當的響應。

二:使用Zend_File_Treansfer接收在服務器端的文件,並把我的上傳API終點的地址在Zend_Form中與設定方法如後

。在這種情況下,文件被上傳到服務器,但提交表單後,地址欄中的網址指向api服務器,並且永遠不會返回到表單。

我做得對嗎?如果不是,請告訴我什麼是最佳做法以及如何做到這一點。

謝謝你的時間。

回答

0

您是否嘗試將重定向添加到處理上傳的控制器操作結束? (如果不是,你真的應該把它作爲在發佈後重定向的好習慣)(確保在你的邏輯執行後重定向)。實質上,接收發布數據的'網頁'應該只處理數據,並且任何想要返回給用戶的關於該發佈後行爲的信息應該在他們重定向到的頁面上給予他們。

[格式] - POST - > [ '後' 的控制器動作] - 重定向(302) - > [成功頁/失敗信息]

2

事情是這樣的工作對我來說:

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 wiki中找到類似的代碼(http://www.php.net/manual/en/function.stream-context-create.php# 90411)。但...這段代碼沒有正確處理回車+換行符,我的服務器立即拒絕該帖子。另外,舊代碼也使用HTTP 1.0版本(不重新使用套接字)。在使用HTTP 1.1時,在發佈大量文件時重新使用套接字。 (這也適用於HTTPS。)我添加了自己的用戶代理 - 如果您在欺騙某個服務器時認爲這是瀏覽器帖子,則可能需要更改用戶代理來欺騙瀏覽器。