Drupal 雖提供 drupal_http_request 執行 HTTP 請求,但在文件上傳場景下,cURL 靈活度更高。本文演示如何在 Drupal 模組中使用 cURL 模擬 multipart/form-data 表單提交,上傳文件至遠程服務器。
<form enctype="multipart/form-data" method="POST" action="https://example.com/upload.php">
<input name="username" type="text" />
<input name="password" type="password" />
<input type="checkbox" name="rememberme" />
<input name="avatar" type="file" />
</form>
<?php
$url = 'https://example.com/upload.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
'username' => 'user123',
'password' => 'pass456',
'rememberme' => '1',
'avatar' => '@' . $file_path, // @ 前綴表示文件上傳
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
if (curl_errno($ch)) {
watchdog('mymodule', 'cURL error: @error', array('@error' => curl_error($ch)), WATCHDOG_ERROR);
}
curl_close($ch);
// $response 包含遠程服務器返回的 HTML 響應
?>
CURLOPT_POSTFIELDS 數組值以 @ 開頭表示文件上傳,需提供絕對路徑curl_errno() 並記錄日誌function mymodule_upload_file($file_path, $remote_url) {
if (!file_exists($file_path)) {
return array('success' => FALSE, 'error' => 'File not found');
}
$ch = curl_init($remote_url);
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => array(
'file' => '@' . realpath($file_path),
'fid' => '123',
),
CURLOPT_SSL_VERIFYPEER => FALSE, // 僅測試環境使用
));
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return array(
'success' => ($http_code == 200),
'response' => $response,
'http_code' => $http_code,
);
}