3

curl でのファイルのアップロードに問題があります。サーバーのファイルをビデオ ホスティング サイトにアップロードしたいと考えています。スクリプトにはContent-type: multipart/form-dataandContent-type: video/mp4が必要ですが、どうすればよいかわかりません。アップロード後、ファイルにはcontent type application/octet-stream.

ここにスクリプトがあります

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
4

2 に答える 2

9

この行を置き換えます:

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

と:

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

そしてそれは動作するはずです。

于 2012-09-09T20:19:48.107 に答える
1

この投稿と同様のアイデアを使用して、Web サービスとの接続に curl を使用し、ファイルをアップロードしましたが、うまくいきませんでした。前の回答とは異なる理由なので、私の解決策を説明します。私の経験が他の人に役立つかもしれません。

私には2つの問題がありました。1 つ目は、Web サービスがファイル名の絶対パスを好まなかったことです。OP コードの $file にパスがある場合は、次を使用します。

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

になります:

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

そのパスが BAD REQUEST を生成しました。そのため、$postdata でパスを使用しないようにするために、chdir、basename、および dirname を使用する必要がありました。

一方、curl は追加のヘッダーを送信しましたが、OP には示されていません。

Expect: 100-continue

私のWebサービスはそれを気に入らず(Twitter WSも)、次のように答えました:

417 Expectation Failed

curl が問題のあるヘッダーを送信しないようにするには、次を使用できます。

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

したがって、空の Expect ヘッダーを設定すると、curl は 100-continue で上書きされません。

これが誰かを助けることを願っています...

于 2013-11-22T20:08:11.830 に答える