2017-09-13 28 views
0

こんにちは私はローカルテキストファイルを別の場所にアップロードする次のCURL呼び出しを行っています。正常に私はサーバーの場所をプッシュします)。しかし、問題はローカルのテキストファイルが投稿されていないことです。ファイルをPOSTする方法はありますか?CURLコールはローカルサーバからリモートサーバにファイルをアップロードしませんPHP

NOTE - 私はのfile_get_contentsまたはFTPアップロードすることでこれをやりたいいけません。他の質問にも言及しましたが、私の問題は解決しませんでした。

<?php 
/* CURL Initilization */ 
$curl = curl_init(); 
/* Setting the remove URL */ 
curl_setopt($curl, CURLOPT_URL, 'http://127.0.0.1/php_training/get_curl_call.php'); 
/* I want to return the transfer and store in data instead of outputing on screen */ 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
/* To upload safely */ 
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true); 
/* Enable sending the data as POST data */ 
curl_setopt($curl, CURLOPT_POST, true); 
/* Sending the data using @ is before 5.5, now I am using curl_file_create */ 
/* realpath - will get the absolute path of the .txt file */ 
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
     'log_file' => curl_file_create(realpath('websites.txt')) 
    ) 
); 
/* Store the response of curl execution */ 
$response = curl_exec($curl); 
print_r($response, curl_error($curl)); 
curl_close($curl); 

以下がget_curl_call.php

<?php 
// $filename = $_POST['log_file']; 
print_r($_POST);exit; 

以下がwebsites.txtファイル

Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201 
Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201 
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201 
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201 

get_curl_call.php

の出力内容であります
Array () 

ファイルがアップロードされない理由を修正できません。どのような助け本当に感謝します。

+0

'$ POSTDATAは文字列でなければなりませんしますcurl_setopt($カール、CURLOPT_POSTFIELDS、$ POSTDATA)'で... – marekful

+0

@marekful大丈夫@marekful –

+0

私の場合を変更し、しようとします上記の投稿データを 'log_file' => file_get_contents(realpath( 'websites.txt'))として使用してください。それを実現する他の方法はありますか?文字列に変換せずに –

答えて

1

次のコードを試してください。必要に応じて更新しました。また、私たちがファイルを投稿するときには、あなたが行っているように、代わりに$_POSTを使って表示されません。$_FILES

私はあなたのコードをテストしていませんが、あなたの主な間違いは、$_POSTを使ってアップロードファイルを印刷していることです。ファイルアップロードは$_FILES配列で利用できます。それを印刷してみてください。

アップロードファイル:(これは旧バージョンのPHPでも互換性があります) 互換性のため、CURLFileが利用できない場合(PHPが5.5未満の場合)、file_get_contentsを使用しました。

<?php 

$file = "websites.txt"; 
upload_with_compatibility($file); 

function upload_with_compatibility($file){ 
    if (version_compare(phpversion(), '5.5', '>=')) { 
     echo "Upload will be done using CURLFile\n"; 
     upload($file); //CURL file upload using CURLFile for PHP v5.5 or greater 
    }else{ 
     echo "Upload will be done without CURLFile\n"; 
     compatibleUpload($file); //CURL file upload without CURLFile for PHP less than v5.5 
    } 
} 

//Upload file using CURLFile 
function upload($file){ 
    $target = "http://localhost:8888/upload_file.php"; 
    $host = parse_url($target); 

    $cFile = new CURLFile($file,'text/plain', $file); 
    $data = array(
     'log_file' => $cFile, 
    ); 

    //you can play around with headers, and adjust as per your need 
    $agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'; 
    $curlHeaders = array(
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 
     'Accept-Encoding: gzip, deflate', 
     'Accept-Language: en-US,en;q=0.8', 
     'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36', //change user agent if you want 
     'Connection: Keep-Alive', 
     'Pragma: no-cache', 
     'Referer: http://localhost:8888/upload.php', //you can change referer, if you want or remove it 
     'Host: ' . $host['host'] . (isset($host['port']) ? ':' . $host['port'] : null), // building host header 
     'Cache-Control: max-age=0', 
     'Cookie: __utma=61117235.2020578233.1500534080.1500894744.1502696111.4; __utmz=61117235.1500534080.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', //adjust your cookie if you want 
     'Expect: ' 
    ); 

    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $target); 
    curl_setopt($curl, CURLOPT_HEADER , true); //we need header 
    curl_setopt($curl, CURLOPT_USERAGENT,$agent); 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_POST, true); // enable posting 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // post images 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload 
    curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true); 
    $r = curl_exec($curl); 
    if (curl_errno($curl)) { 
     $error = curl_error($curl); 
     print_r($error); 
    } else { 
     // check the HTTP status code of the request 
     $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
     if ($resultStatus != 200) { 
      print_r($resultStatus); 
     }else{ 
      //successfull 
      print_r($r); 
     } 
    } 
    curl_close($curl); 
} 

//Upload file without using CURLFile, because we are upload a file, so we need to generate form boundry 
function compatibleUpload($file){ 
    $target = "http://localhost:8888/upload_file.php"; 
    //use this to send any post parameters expect file types 
    //if you are not sending any other post params expect file, just assign an empty array 
    // $assoc = array(
    //  'name' => 'demo', 
    //  'status' => '1' 
    //); 
    $assoc = array(); //like this 

    //this array is used to send files 
    $files = array('log_file' => $file); 

    static $disallow = array("\0", "\"", "\r", "\n"); 

    // build normal parameters 
    foreach ($assoc as $k => $v) { 
     $k = str_replace($disallow, "_", $k); 
     $body[] = implode("\r\n", array(
      "Content-Disposition: form-data; name=\"{$k}\"", 
      "", 
      filter_var($v), 
     )); 
    } 

    // build file parameters 
    foreach ($files as $k => $v) { 
     switch (true) { 
      case false === $v = realpath(filter_var($v)): 
      case !is_file($v): 
      case !is_readable($v): 
       continue; // or return false, throw new InvalidArgumentException 
     } 
     $data = file_get_contents($v); 
     $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v)); 
     $k = str_replace($disallow, "_", $k); 
     $v = str_replace($disallow, "_", $v); 
     $body[] = implode("\r\n", array(
      "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"", 
      "Content-Type: application/octet-stream", 
      "", 
      $data, 
     )); 
    } 

    // generate safe boundary 
    do { 
     $boundary = "---------------------" . md5(mt_rand() . microtime()); 
    } while (preg_grep("/{$boundary}/", $body)); 

    // add boundary for each parameters 
    array_walk($body, function (&$part) use ($boundary) { 
     $part = "--{$boundary}\r\n{$part}"; 
    }); 

    // add final boundary 
    $body[] = "--{$boundary}--"; 
    $body[] = ""; 

    // set options 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $target); 
    curl_setopt($ch, CURLOPT_HEADER , true); //we need header 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt_array($ch, array(
     CURLOPT_POST  => true, 
     CURLOPT_POSTFIELDS => implode("\r\n", $body), 
     CURLOPT_HTTPHEADER => array(
      "Expect: ", 
      "Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type 
     ), 
    )); 
    $r = curl_exec($ch); 
    if (curl_errno($ch)) { 
     $error = curl_error($ch); 
     print_r($error); 
    } else { 
     // check the HTTP status code of the request 
     $resultStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     if ($resultStatus != 200) { 
      print_r($resultStatus); 
     }else{ 
      //successfully uploaded 
      print_r($r); 
     } 
    } 
    curl_close($ch); 
} 
?> 

アップロード処理:私がアップロードしようとした

<?php 
    print_r($_POST); //this will print post varibales expect file types 
    print_r($_FILES); // this will print files that are posted 
?> 

はサンプル:(websites.txt)

Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201 
Sat Sep 9 07:31:18 2017 notifications.google.com 192.168.150.201 
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201 
Sat Sep 9 07:31:19 2017 plus.l.google.com 192.168.150.201 

CURL結果の出力(5.5とアップ版PHP)

Upload will be done using CURLFile 
HTTP/1.1 200 OK 
Date: Wed, 13 Sep 2017 07:11:07 GMT 
Server: Apache 
X-Powered-By: PHP/5.5.38 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html 

Array 
(
) 
Array 
(
    [log_file] => Array 
     (
      [name] => websites.txt 
      [type] => text/plain 
      [tmp_name] => /Applications/MAMP/tmp/php/phpRp8S4T 
      [error] => 0 
      [size] => 245 
     ) 

) 

CURL結果の出力(PHP ver less th私は5.4.45でテスト5.5、)

Upload will be done without CURLFile 
HTTP/1.1 200 OK 
Date: Wed, 13 Sep 2017 07:17:43 GMT 
Server: Apache 
X-Powered-By: PHP/5.4.45 
Transfer-Encoding: chunked 
Content-Type: text/html 

Array 
(
) 
Array 
(
    [log_file] => Array 
     (
      [name] => websites.txt 
      [type] => application/octet-stream 
      [tmp_name] => /Applications/MAMP/tmp/php/phpQWGlEG 
      [error] => 0 
      [size] => 245 
     ) 

) 
+0

ちょっと私のニーズに変更した後も動作しません。 CURL経由でファイルをアップロードすることは可能ですか? –

+0

はい、可能です。あなたのニーズに合った具体的な例を作りましょう。あなたを更新します。 PHPのバージョンは何ですか? –

+0

それは私にとって大きな助けになるでしょう。私が1つを得ることができれば本当に感謝します。 –

関連する問題