2017-03-21 10 views
0

リモートサーバーにcURLを使用してファイルをアップロードする際に問題があります。 リモートサーバは、POST変数が順番に来る場合にのみファイルを受け入れます。 私の場合:sid、cmd、uploadfile シンプルなHTMLアップロードフォームをこの順番でテストしましたが、すべて正常です。しかし、入力フィールドの順序を入れ替えると:cmd、sid、uploadfile アップロードが拒否されます。PHP Curlアップロード、配列に設定された順番で値を投稿

私のcURLコードはここにあります。配列に設定した順序で変数を送信しません。 変数を設定したのと同じ順序で強制的にcURLをPOSTにします。

$file = "/var/www/html/dl/big.mp4"; 

$target_url = 'http://upload.site/uploadpage'; 
$file_name_with_full_path = realpath($file); 
$post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path); 

$ch = curl_init(); 
$browser = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'; 
curl_setopt($ch, CURLOPT_USERAGENT, $browser); 
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); 
curl_setopt($ch, CURLOPT_URL, $target_url); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                   
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
'Accept-Encoding: gzip, deflate', 
'Accept-Language: en-US,en;q=0.5', 
'Cache-Control: max-age=0', 
'Connection: keep-alive', 
'Host: upload.sitehost', 
    )                 
);  
$result=curl_exec($ch); 
curl_close ($ch); 
echo $result; 

答えて

0

PHP documentationは、これは約CURLOPT_POSTFIELDS言う:

このパラメータは、いずれかの 'PARA1 = val1と& PARA2 = val2の& ...' のようなURLエンコード文字列としてまたはフィールドを持つ配列として渡すことができますキーとしての名前と、値としてのフィールドデータ。

ので、代わりにhttp_build_query()を使用してみてください:CURLOPT_SAFE_UPLOADを設定することは素晴らしいアイデアではありません、

<?php 
$post = array('sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 'cmd' => 'uploadVideoFiles', 'uploadfile'=>'@'.$file_name_with_full_path); 
$post = http_build_query($post); 
... 
しかし。代わりに、あなたの最終的なコードは次のようになりますので、あなたは、 curl_file_create()を使用する必要があります:私はそれは私のせいだった、問題を解決し

<?php 
$file = "/var/www/html/dl/big.mp4"; 

$target_url = 'http://upload.site/uploadpage'; 
$file_name_with_full_path = realpath($file); 
$post = [ 
    'sid' => 'H1nbWKcdYP7eS7DzJk0Z6BjGaC842vPO', 
    'cmd' => 'uploadVideoFiles', 
    'uploadfile'=>curl_file_create($file_name_with_full_path) 
]; 
$post = http_build_query($post); 

$ch = curl_init($target_url); 
curl_setopt_array($ch, [ 
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 
    CURLOPT_POSTFIELDS => $post, 
    CURLOPT_POST => true, 
    CURLOPT_RETURNTRANSFER => true, 
]); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
+0

すでにhttp_build_query() のurlencoded curlop_postfieldも試しました。 私はcurl_exec($ ch)をprintigして、応答1を取得します。 しかし、私はこのようにJSONレスポンスを必要とする:応答があるuploadfileポスト順序は、SID、CMDではない場合} ' ' "レスポンス":{ "u354DrwWnEIZUD2x" "コード":0、 "vcode"} '{"応答 ":{"コード ":2}}' – ForWhhY

+0

私の更新を参照してください。デフォルトでは何も返されません。 – miken32

+0

あなたのコードをテストしましたが、まだ結果が得られます:1、多分OKですが、私はjsonの応答が必要です – ForWhhY

0

、cmdは

'cmd' => 'uploadVideoFiles' 

ない

だったそれはだった:

'cmd' => 'uploadVideoFile' 
関連する問題