[PHP-users 11463] cURLでのファイルアップロード

SEGAMI Takashi php-users@php.gr.jp
Wed, 13 Nov 2002 19:17:01 +0900


瀬上です。

動作環境:PHP 4.2.2 / Win 2K / Apache 1.3.27

cURLを使って、サーバから別のWebサーバへファイルのアップロードをしようと
試みました。つぎのようなサンプルを使って、なんとかアップロードは出来たの
ですが、期待する$_FILES['upfile']変数が存在せず、文字化けした
$_FILES['upfile.????']変数として存在します。これはなぜでしょう?
使用方法が間違っているのかと思い、試しに、CURLOPT_POSTFIELDSに渡す
連想配列のキー名に"upfile[]"とすると、

$posts = array(
	"user"  => "userA",
	"upfile[]" => "@".$fname,
//             ^^
);

文字化けは起こらなくなるのですが、受け取った$_FILES['upfile']の中身が
やはり期待する内容と違います。$_FILES['upfile']変数をprint_rすると、
以下のような感じになります。

Array (
	[0] => c:/data/data1.zip
	[1] => text/plain
	[tmp_name] => c:\winnt\php2ff6.tmp
	[error] => 0
	[size] = 1534
)

これは、cURLのバグでしょうか? それともPHPのバグでしょうか?
あるいは記述にミスがあるのでしょうか?

===================================================================
--- foo.php 
<?php
$url = "http://www2.foo.com/upload.php";
$fname = "c:/data/data1.zip";
$posts = array(
	"user"  => "userA",
	"upfile" => "@".$fname,
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
ob_start();
curl_exec($ch);
$result = ob_get_contents();
ob_end_clean();
curl_close($ch);
print $result;
?>

--- upload.php
<?php
include_once("config.php");

$user = $_POST['user'];
$spooldir = STOCKDIR."/".$user;
if (!is_dir($spooldir)) @mkdir($spooldir, 0700); 
print_r($_FILES);
foreach ($_FILES as $key => $val) {
	$tmpfile = $val['tmp_name'];
	$orgfile = $spooldir."/".basename($val['name']);
	echo $orgfile;
	if (copy($tmpfile, $orgfile)) {
		echo "-> Copy successful";
		echo " (size=".filesize($orgfile)." bytes)";
	}
	else {
		echo "-> Copy failure !!";
	}
}

/* DEBUGとして */
ob_start();
phpinfo();
$buff = ob_get_contents();
ob_end_clean();
$fp = fopen("c:/temp/phpinfo.htm","w");
fwrite($fp, $buff);
fclose($fp);

?>


/*
 * 瀬上 孝司 / SEGAMI Takashi <sage@tokyo.microcad.co.jp>
 * 株式会社マイクロ・シー・エー・デー 第2システム開発室
 */