Использование PHP и curl для публикации HTML-формы, содержащей файл - PullRequest
1 голос
/ 15 июля 2010

У меня есть такая форма:

<form method="POST" action="i.php" enctype="multipart/form-data">
 <input type="text" name="field1">
 <input type="text" name="field2">
 <input type="file" name="file">
 <input type="hidden" name="MAX_FILE_SIZE" value="100000">
 <input type="submit">
</form>

На странице, которая у меня уже есть:

$URL = 'http://somewhere.com/catch.php';
$fields = array('field1'=>urlencode($_POST['field1'), 'field2'=>urlencode($_POST['field2'));

    foreach($fields as $key=>$value) { $fields_string  .= $key.'='.$value.'&'; };

    rtrim($fields_string,'&');
    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$URL);
    curl_setopt($ch,CURLOPT_POST,count($fields));
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

    $result = curl_exec($ch);

    curl_close($ch);

, которая работает для публикации полей field1 и 2.Можно ли как-то включить файл в этот процесс curl?Как бы я это сделал?Я предполагаю, что мне нужно сделать больше, чем просто зашифровать значение файла.

Поэтому, основываясь на ответе SimpleCoders, я обновил следующее:

$URL = 'http://somewhere.com/catch.php';
$fields = array('field1'=>urlencode($_POST['field1'), 'field2'=>urlencode($_POST['field2'), 'files'=>'@'. $_FILES['file']['tmp_name']);

    foreach($fields as $key=>$value) { $fields_string  .= $key.'='.$value.'&'; };

    rtrim($fields_string,'&');
    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$URL);
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

    $result = curl_exec($ch);

    curl_close($ch);

, который пишет ОК, а затем мой результатМассив $ _FILES в catch.php пуст.В соответствии с примером №2 на http://www.php.net/manual/en/function.curl-setopt.php Это должно работать.

Я делаю это на двух разных доменах ... может ли это быть проблемой?

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

Попробуйте что-то вроде этого, взято отсюда :

$file_to_upload = array('file_contents'=>'@'.$file_name_with_full_path); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$target_url); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_to_upload); 
$result=curl_exec ($ch); 
curl_close ($ch); 
echo $result;

Также рассмотрим https://secure.php.net/manual/en/class.curlfile.php,, который представляется более простым, более современным способом сделать это.

1 голос
/ 15 июля 2010

Вы должны следовать ответу SimpleCoders, но затем изменить свой

$fields_string

до

$fields.  

С http://www.php.net/manual/en/function.curl-setopt.php

Примечание. Передача массива в CURLOPT_POSTFIELDS будет кодировать данные как multipart / form-data, а передача строки в кодировке URL будет кодировать данные как application / x-www-form-urlencoded.

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