使用CURLOPT_POSTFIELDS POST文件时文件为空

时间:2012-02-14 13:15:34

标签: php file rest post curl

我正在尝试使用RESTful Web服务上传文件,如下所示:

$filename = "pathtofile/testfile.txt";
$handle = fopen($filename, "r");
$filecontents = fread($handle, filesize($filename));
fclose($handle);

$data = array('name' => 'testfile.txt', 'file' => $filecontents);

$client = curl_init($url);
curl_setopt($client, CURLOPT_POST, true);
curl_setopt($client, CURLOPT_POSTFIELDS, $data);
curl_setopt($client, CURLOPT_RETURNTRANSFER, 1);
curl_close($client);

但我保持gettig 文件为空 作为此请求的回复。

我还尝试发送文件路径,如:

$data = array('name' => 'testfile.txt', 'file' => 'pathtofile/testfile.txt');
curl_setopt($client, CURLOPT_POSTFIELDS, $data);

或:只发送文件内容,如:

curl_setopt($client, CURLOPT_POSTFIELDS, $filecontents);

但同样的回复: 文件为空

请注意:该文件存在且不为空,我只是尝试仅上传该文件而无其他字段。

我看到this post,但同样的问题,任何想法?

1 个答案:

答案 0 :(得分:1)

试试这个:

$data = array ('myfile' => '@'.$filename);

这将为接收端填充$_FILE ['myfile']

编辑:要实际将文件内容作为正文,您可以直接执行:

//Get the file data
$body = file_get_contents ($filename);
$len = strlen ($body);

//Open a direct connection to the server on port 80
$socket = fsockopen ('hostname.example.com', 80);

//Write the HTTP request headers
fwrite ($socket, "POST /path/to/url HTTP/1.1\r\n");
fwrite ($socket, "Host: hostname.example.com\r\n");
fwrite ($socket, "Connection: Close\r\n");
fwrite ($socket, "Content-Length: " . $len . "\r\n");

//Empty line marks end of headers, start of body
fwrite ($socket, "\r\n");

//Actually write the body
fwrite ($socket, $body);

//Get the result (half a kB at a time)
$result = '';
while (!feof ($socket)) $result .= fread ($socket, 512);

//Clean up nicely
fclose ($socket);

请注意,该代码未经测试,但它应该为您提供一般的想法。