42

リモート サーバーにファイルをアップロードするための非常に単純な PHP コードがありました。私が行っていた方法 (ここでいくつかの他のソリューションで提案されているように) は、cUrl を使用してファイルをアップロードすることです。

これが私のコードです:

$ch = curl_init("http://www.remotesite.com/upload.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['Filedata']['tmp_name'])); 
echo curl_exec($ch);        

サーバーは PHP 5.5.0 を実行しており、@filename は PHP >= 5.5.0 で非推奨になっているようです。説明の下に記載されてCURLOPT_POSTFIELDSいるように、このエラーが発生します。

Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in ... 

興味深いことに、php.net には、基本的なクラスの概要以外に、このクラスに関する情報はまったくありません。例も、メソッドやプロパティの説明もありません。ここは基本的に空白です。これはドキュメントがほとんどまたはまったくなく、実際の使用がほとんどない新しいクラスであることを理解しています。そのため、このクラスの Google またはここでの Stackoverflow の検索で実質的に関連するものは何も出てきません。

この CURLFile クラスを使用したことがあり、私のコードで @filename の代わりにそれを使用することについて、私を助けたり、例を挙げたりできる人がいるかどうか疑問に思っています。

編集:

「upload.php」コードも追加したかったのです。このコードは従来の @filename メソッドで機能しますが、CURLFile クラス コードでは機能しなくなりました。

$folder = "try/";
$path = $folder . basename( $_FILES['file']['tmp_name']); 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['tmp_name']). " has been uploaded";
}

最終編集:

ほとんど文書化されていない CURLFile クラスの同様の作業例を探している他の人のために、最終/作業コードを追加したかった...

curl.php (ローカルサーバー)

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label> <input type="file" name="Filedata" id="Filedata" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

<?php
if ($_POST['submit']) {
    $uploadDir = "/uploads/";
    $RealTitleID = $_FILES['Filedata']['name'];
    $ch = curl_init("http://www.remotesite.com/upload.php"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
    $result = curl_exec($ch);       
}
?>

upload.php (リモートサーバー)

$folder = "try/";
$path = $folder . $_FILES['file']['name']; 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['name']). " has been uploaded";
} 
4

5 に答える 5

52

コードの RFC にスニペットがあります: https://wiki.php.net/rfc/curl-file-upload

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = new CurlFile('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

curl_file_create( string $filename [, string $mimetype [, string $postname ]] )オブジェクトを作成するのが苦手な場合は、一見無意味な機能を使用することもできます。

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = curl_file_create('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);
于 2013-06-10T21:17:58.060 に答える
1

FOR curl_setopt(): ファイルのアップロードに @filename API を使用することは非推奨です。代わりに CURLFile クラスを使用してください

$img='image.jpg';

$data_array = array(
        'board' => $board_id,
        'note' => $note,
        'image' => new CurlFile($img)
    );

$curinit = curl_init($url);
     curl_setopt($curinit, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curinit, CURLOPT_POST, true);
     curl_setopt($curinit, CURLOPT_CUSTOMREQUEST, "POST");
     curl_setopt($curinit, CURLOPT_POSTFIELDS, $data_array);
     curl_setopt($curinit, CURLOPT_SAFE_UPLOAD, false);
     $json = curl_exec($curinit);
     $phpObj = json_decode($json, TRUE);  
     return $phpObj;
于 2016-07-21T11:42:01.160 に答える