8

libCURL でこの奇妙な動作が発生しています。(libCURL の man ページに記載されているように) ファイル名の先頭に「@」を追加してファイルをアップロードしようとすると、ファイルの内容がアップロードされる代わりに、libCURL はファイル名自体を送信します (先頭に @ を付けます)。

これは、Windows 2008 R2 で実行されており、xampp バージョン 5.6.8 では、curl がコンパイルされています (curl バージョン 7.40.0)。

関連するコードフラグメントは次のとおりです。

$post['pic'] = "@C:\\image.png";

$ret = curl_setopt( $ch, CURLOPT_POST, TRUE );
if (!$ret) die("curl_setopt CURLOPT_POST failed");
$ret = curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
if (!$ret) die("curl_setopt CURLOPT_POSTFIELDS failed");

$response = curl_exec( $ch );

このコードは Linux では機能しますが、Windows Server 2008 では機能しません。

取得したフォームデータは次のとおりです。

Content-Type: multipart/form-data; \\
boundary=------------------------c74a6af8b52d997a

--------------------------c74a6af8b52d997a
Content-Disposition: form-data; name="pic"

@C:\image.png
--------------------------c74a6af8b52d997a--

ご覧@C:\image.pngの通り中身ではなく受け取ります。

libCURL がファイルの内容をアップロードしない理由を知っている人はいますか?

4

1 に答える 1

5

curl-setoptのドキュメントから

CURLOPT_POSTFIELDS HTTP "POST" 操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の先頭に @ を付け、フル パスを使用します。ファイルタイプは、ファイル名の後に「;type=mimetype」の形式でタイプを指定することにより、明示的に指定できます。このパラメーターは、'para1=val1¶2=val2&...' のような urlencoded 文字列として渡すか、フィールド名をキーとしてフィールド データを値として持つ配列として渡すことができます。値が配列の場合、Content-Type ヘッダーは multipart/form-data に設定されます。PHP 5.2.0 以降、ファイルが @ 接頭辞付きでこのオプションに渡される場合、値は配列でなければなりません。PHP 5.5.0 以降、@ プレフィックスは廃止され、CURLFile を使用してファイルを送信できます。CURLOPT_SAFE_UPLOAD オプションを TRUE に設定することで、@ で始まる値を安全に渡すために @ プレフィックスを無効にすることができます。

動作は php リリースに依存し、@ プレフィックスは非推奨になりました。

次のようにCurlFile クラスを使用して、curl リクエストの CURLOPT_POSTFIELDS を設定する必要があります。

$post['pic'] = new CurlFile('C:\\image.png');
$ret = curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
于 2015-08-02T16:50:50.563 に答える