PHP Curl Proxy, как определить $ _FILES ['foo'] ['name'] - PullRequest
1 голос
/ 24 февраля 2011

Я использую 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);

Пс .: Я знаю, что мог бы создать новую переменную, но цель здесь состоит в том, чтобы уважать формат переменной и сделать использование прокси-сервера максимально прозрачным для человека, который будет его использовать.

Это я или единственное решение - переименовать файл 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 голосов
/ 21 апреля 2015

Столкнулся с подобной ситуацией, и вот как я ее решил

Передайте фактическое имя файла вместе с запросом

$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'];
}
0 голосов
/ 24 февраля 2011

Я думаю, что вы не должны использовать файл tmp, но вместо этого сохраните файл с его настоящим именем где-нибудь, передайте его параметру POSTFIELDS и после выполнения удалите его.Это кажется самым простым способом для меня.curl не заботится об исходном запросе, он просто делает то, что вы говорите, и он ... отправляет временный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...