我正在使用CURL创建一个转发多部分表单的PHP代理 表单有一个输入类型=“文件”。
代理收到以下数据:
array
'foo' =>
array
'name' => string 'wt.jpg' (length=6)
'type' => string 'image/jpeg' (length=10)
'tmp_name' => string '/tmp/phpoIvraK' (length=14)
'error' => int 0
'size' => int 7427
所以我希望最后的页面能够接收相同的数组(tmp_name除外) 现在我收到了这个:
'foo' =>
array
'name' => 'phpoIvraK'
'type' => 'image/jpeg'
'tmp_name' => '/tmp/php5ZhCwy'
'error' => 0
'size' => 7427
如您所见,该名称现在是代理接收的tmp_name,因此原始文件名将丢失。
这是PHP代码:
$arrFields = $_POST;
foreach($_FILES as $k => $file)
$arrFields[$k] = '@' . $file['tmp_name'] . ';type=' . $file['type'];
curl_setopt($ressource, CURLOPT_POSTFIELDS, $arrFields);
Ps。:我知道我可以创建一个新变量,但这里的目标是尊重变量格式,并使代理的使用对于使用它的人尽可能透明。
是我还是唯一的解决方案是重新命名/ tmp中的tmp文件然后重新发送它?这对我来说有点傻了......
$arrFields = $_POST;
foreach($_FILES as $k => $file){
move_uploaded_file($file['tmp_name'], $file['name']);
$arrFields[$k] = '@' . $file['name'] . ';type=' . $file['type'];
}
curl_setopt($ressource, CURLOPT_POSTFIELDS, $arrFields);
答案 0 :(得分:0)
我认为你不应该使用tmp文件,而是将文件的真实名称存储在某处,将其传递给POSTFIELDS参数并在执行后删除它。这对我来说似乎是最简单的方式。 curl不关心原始请求,它只是做你告诉它做的事情,那就是...发送临时文件。
答案 1 :(得分:0)
面对类似的情况,这就是我解决它的方式
将实际文件名与请求一起传递
$arrInputs["uploadvia"] = 'curl';
$arrInputs["actualfilename"]= $_FILES["upfile1"]["name"];
$arrInputs["upfile1"] = "@".$_FILES["upfile1"]["tmp_name"].";type=".$_FILES["upfile1"]["type"].";";
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrInputs);
而在另一端,把这个块
if($_POST['uploadvia'] == "curl")
{
$_FILES["upfile1"]["name"] = $_REQUEST['actualfilename'];
}