私はAPIを書いており、フォームPOST
からのファイルのアップロードを処理したいと思っています。フォームのマークアップは複雑すぎません:
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<input type="file" name="image" id="image" />
<input type="submit" name="upload" value="Upload" />
</fieldset>
</form>
ただし、このサーバー側を処理し、cURLリクエストとともに送信する方法を理解するのは困難です。
私は、データ配列を持つcURLでPOST
リクエストを送信することに精通しており、ファイルのアップロードについて読んだリソースでは、ファイル名の前に@
記号を付けるよう指示しています。しかし、これらの同じリソースにはハードコードされたファイル名があります。
$post = array(
'image' => '@/path/to/myfile.jpg',
...
);
これはどのファイルパスですか?どこで見つけることができますか? $_FILES['image']['tmp_name']
のようなものになりますか。この場合、$post
配列は次のようになります。
$post = array(
'image' => '@' . $_FILES['image']['tmp_name'],
...
);
それとも私はこれについて間違った方法で行っていますか?アドバイスをいただければ幸いです。
編集:誰かが次のコードスニペットを使用する場所のコードスニペットを提供してくれたら、私は最も感謝しています。私は主に、cURLパラメーターとして送信するものと、受信パラメーターでこれらのパラメーターを使用する方法のサンプルを後にしています(引数のためにcurl_receiver.php
と呼びましょう)。
このWebフォームがあります。
<form action="script.php" method="post" enctype="multipart/form-data">
<fieldset>
<input type="file" name="image />
<input type="submit" name="upload" value="Upload" />
</fieldset>
</form>
そして、これはscript.php
になります:
if (isset($_POST['upload'])) {
// cURL call would go here
// my tmp. file would be $_FILES['image']['tmp_name'], and
// the filename would be $_FILES['image']['name']
}
以下は、ファイルをftpに送信する本番コードです(あなたにとって良い解決策かもしれません):
// This is the entire file that was uploaded to a temp location.
$localFile = $_FILES[$fileKey]['tmp_name'];
$fp = fopen($localFile, 'r');
// Connecting to website.
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD, "[email protected]:password");
curl_setopt($ch, CURLOPT_URL, 'ftp://@ftp.website.net/audio/' . $strFileName);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'CURL_callback');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));
curl_exec ($ch);
if (curl_errno($ch)) {
$msg = curl_error($ch);
}
else {
$msg = 'File uploaded successfully.';
}
curl_close ($ch);
$return = array('msg' => $msg);
echo json_encode($return);
この投稿を見つけてPHP5.5 +を使用している人にとっては、これが役立つかもしれません。
ネットコーダーによって提案されたアプローチが機能していなかったことがわかりました。つまり、これは機能しませんでした:
_$tmpfile = $_FILES['image']['tmp_name'];
$filename = basename($_FILES['image']['name']);
$data = array(
'uploaded_file' => '@'.$tmpfile.';filename='.$filename,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
_
_$_POST
_ varには_'uploaded_file'
_フィールドを受け取り、_$_FILES
_ varには何も受け取りません。
php5.5 +には、使用する必要がある新しいcurl_file_create()
関数があることがわかります。したがって、上記は次のようになります。
_$data = array(
'uploaded_file' => curl_file_create($tmpfile, $_FILES['image']['type'], $filename)
);
_
_@
_形式は非推奨になったため。
これは動作するはずです:
$tmpfile = $_FILES['image']['tmp_name'];
$filename = basename($_FILES['image']['name']);
$data = array(
'uploaded_file' => '@'.$tmpfile.';filename='.$filename,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// set your other cURL options here (url, etc.)
curl_exec($ch);
受信スクリプトには、次のものがあります。
print_r($_FILES);
/* which would output something like
Array (
[uploaded_file] => Array (
[tmp_name] => /tmp/f87453hf
[name] => myimage.jpg
[error] => 0
[size] => 12345
[type] => image/jpeg
)
)
*/
次に、ファイルのアップロードを適切に処理する場合は、次のようにします。
if (move_uploaded_file($_FILES['uploaded_file'], '/path/to/destination/file.Zip')) {
// do stuff
}
私の@記号が機能しなかったので、私はいくつかの調査を行い、この方法を見つけました。
$target_url = "http://server:port/xxxxx.php";
$fname = 'file.txt';
$cfile = new CURLFile(realpath($fname));
$post = array (
'file' => $cfile
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec ($ch);
if ($result === FALSE) {
echo "Error sending" . $fname . " " . curl_error($ch);
curl_close ($ch);
}else{
curl_close ($ch);
echo "Result: " . $result;
}
メッセージングシステムを介してMercadolibreに添付ファイルを送信する場合に役立ちます。
Anwswer https://stackoverflow.com/a/35227055/7656744
$target_url = "http://server:port/xxxxx.php";
$fname = 'file.txt';
$cfile = new CURLFile(realpath($fname));
$post = array (
'file' => $cfile
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec ($ch);
if ($result === FALSE) {
echo "Error sending" . $fname . " " . curl_error($ch);
curl_close ($ch);
}else{
curl_close ($ch);
echo "Result: " . $result;
}
手続き型メソッドのcURLファイルオブジェクト:
$file = curl_file_create('full path/filename','extension','filename');
oopメソッドのcURLファイルオブジェクト:
$file = new CURLFile('full path/filename','extension','filename');
$post= array('file' => $file);
$curl = curl_init();
//curl_setopt ...
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl);
curl_close($curl);