2012-09-09 52 views
3

我用curl文件上傳時遇到了問題。我想在視頻託管網站上傳我的服務器文件。該腳本需要Content-type: multipart/form-dataContent-type: video/mp4,但我不知道我該怎麼做。上傳後,文件有content type application/octet-stream用multipart/form-data捲曲文件上傳

這裏是腳本

class curl 
{ 
     function __construct($use = 1) 
     { 
     $this->ch = curl_init(); 
       if($use = 1) 
       { 
         curl_setopt ($this->ch, CURLOPT_POST, 1); 
         curl_setopt ($this->ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
         curl_setopt ($this->ch, CURLOPT_FOLLOWLOCATION, 1); 
         curl_setopt ($this->ch, CURLOPT_RETURNTRANSFER, 1); 
       } 
       else 
       { 
         return 'There is the possibility, that this script wont work'; 
       } 
     } 
     function first_connect($loginform,$logindata) 
     { 
       curl_setopt($this->ch, CURLOPT_URL, $loginform); 
       curl_setopt($this->ch, CURLOPT_POSTFIELDS, $logindata); 
     } 
     function store() 
     { 
       $this->content = curl_exec ($this->ch); 
     } 
     function execute($page) 
     { 
       curl_setopt($this->ch, CURLOPT_URL, $page); 
       $this->content = curl_exec ($this->ch); 
     } 
     function close() 
     { 
       curl_close ($this->ch); 
     } 

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

     function upload($file) 
     { 
      curl_setopt($this->ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data")); 
      curl_setopt($this->ch, CURLOPT_URL, 'http://uploadsite.com/index.php?act=files&do=upload'); 
      $postdata = array("file[]" => "@/".realpath($file)); 
      echo $postdata; 
      curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postdata); 
      curl_exec ($this->ch); 
     } 
} 


$getit = new curl(); 
$getit->first_connect('http://uploadsite.com/index.php?act=login&login=true','login=true&file_session=&email=xxx%40yahoo.de&password=xxx&upload=Login'); 
$getit->store(); 
$getit->execute('http://uploadsite.com/index.php?act=user&do=home'); 
$getit->upload('Sample.mp4'); 

而且從livehttpheaders

http://uploadsite.com/index.php?act=files&do=upload 

POST /index.php?act=files&do=upload HTTP/1.1 
Host: yourupload.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Referer: http://yourupload.com/index.php?act=user&do=home 
Content-Length: 41648931 
Content-Type: multipart/form-data; boundary=---------------------------265001916915724 
Cookie: _pk_ref.9.d1ba=%5B%22%22%2C%22%22%2C1347200605%2C%22http%3A%2F%2F62.75.242.162%2Findex.php%22%5D; _pk_id.9.d1ba=08e499ca1b88c81c.1345157523.12.1347203814.1347189831.; PHPSESSID=jjajqi2mi7fe1blso5qvge9ue5; _pk_ses.9.d1ba=*; member_id=3051; member_pass=xxx 
Pragma: no-cache 
Cache-Control: no-cache 
-----------------------------265001916915724 
Content-Disposition: form-data; name="file[]"; filename="Sample.mp4" 
Content-Type: video/mp4 


HTTP/1.1 200 OK 
Server: nginx/0.7.67 
Date: Sun, 09 Sep 2012 15:23:56 GMT 
Content-Type: text/html 
Transfer-Encoding: chunked 
Connection: keep-alive 
X-Powered-By: PHP/5.3.3-7+squeeze13 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 

回答

9

包替換此行:

$postdata = array("file[]" => "@/".realpath($file)); 

有:

$postdata = array("file[]" => "@/".realpath($file).";type=video/mp4"); 

它應該工作。

+0

是的,謝謝你:) – user1488846

1

我已經使用curl來連接一個web服務,並使用類似的想法上傳一個文件,但它沒有奏效。與之前的答案不同的原因,所以我將描述我的解決方案;也許我的經驗對別人有用。

我有兩個問題。第一個是我的Web服務不喜歡文件名中的絕對路徑。如果OP代碼$文件有一個路徑,然後使用:

$postdata = array('file[]' => "@/".realpath($file)); 

變爲:

Content-Disposition: form-data; name="file[]"; filename="/tmp/iy56ham" 

和路徑產生了錯誤的請求。所以我不得不使用chdir,basename和dirname以避免在$ postdata中使用路徑。

在另一方面,捲曲發一個額外的頭,在OP未顯示:

Expect: 100-continue 

我的web服務不喜歡它(沒有嘰嘰喳喳WS),並將其與回答:

417 Expectation Failed 

爲了避免捲曲發送該問題的頭,你可以使用:

curl_setopt($curlHandler, CURLOPT_HTTPHEADER, array('Expect:')); 

所以你設置空預計頭捲曲不會被100次繼續覆蓋。

希望這可以幫助別人......