PHP Curl Proxy,如何定义$ _FILES ['foo'] ['name']

时间:2011-02-23 21:29:36

标签: php curl filenames

我正在使用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);

2 个答案:

答案 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'];
}