Опубликовать загруженный файл на другую страницу PHP? - PullRequest
1 голос
/ 16 декабря 2009

Вот моя проблема. У меня есть система отслеживания билетов, которая не очень удобна для пользователей, но у меня есть желание, чтобы мои пользователи отправляли «билеты» в систему, чтобы они ее не видели.

Я дошел до того, что использовал собственную форму HTTP и отправил сообщение в систему отслеживания билетов. Одной из проблем является то, что страница «успех / завершение» имеет тенденцию вводить людей в заблуждение. Итак, я подумала ... хорошо, поскольку я не могу изменить систему заявок, чтобы использовать другую страницу «успеха». Я просто займусь обменом HTTP Post с CURL и сообщу о пользовательской странице успеха или проблемы. Вот какой-то абстрактный код.

Файл: tickethelper.php

<?php
extract($_POST);
$url = 'TICKETSYSTEMURL';
$fields = array(
        'fullname'=>urlencode($fullname),
        /*many more fields*/
        );

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);
curl_setopt($ch, CURLOPT_MAXREDIRS, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$contents = curl_exec($ch); 
curl_close($ch);
if((strlen(strstr($contents,'Your ticket has been submitted')))>0){
        header("Location: http://THANKYOU");
}
        else{
                header("Location: http://OOPS");
        }

?>

Однако я понял, что мне не хватает загрузки файла. Большинство примеров CURL, которые я видел, связаны с загрузкой локальных файлов на удаленную страницу HTTP POST.

Как мне обработать получение файла из формы HTTP моего пользователя, обработать его в 'tickethelper' и отправить его в 'TICKETSYSTEMURL'?

-Israel

Ответы [ 2 ]

1 голос
/ 16 декабря 2009

Во-первых, ваш скрипт может получить доступ к загруженному файлу через массив $ _FILES.

С http://www.tizag.com/phpT/fileupload.php

В массиве $ _FILES хранится PHP вся информация о файлах. Там два элемента этого массива, которые мы нужно будет понять для этого Пример.

  • uploadedfile - uploadedfile - это ссылка, которую мы присвоили в нашем HTML форма. Нам нужно это сказать Массив $ _FILES, какой файл мы хотим поиграть с.
  • $ _ FILES ['uploadedfile'] ['name'] - имя содержит исходный путь к загруженному пользователем файлу.
  • $ _ FILES ['uploadedfile'] ['tmp_name'] - tmp_name содержит путь к временный файл, который находится на сервер. Файл должен существовать на сервер во временном каталоге с временное имя.

Чтобы включить этот файл в POST, который вы отправляете с помощью libcurl, используйте массив полей вместо строки. Включить файл в качестве одного из полей:

$post_fields = array (
    $key => $value,
    ...
    $file_key => "@" . $filename,
);

Если вы используете символ «@», libcurl прочитает файл и включит его в POST.

Затем используйте

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
1 голос
/ 16 декабря 2009

Ну, я не могу сказать, что сделал это сам, но согласно документации PHP относительно CURL и обработки файлов ( PHP.net )

CURLOPT_INFILE | Файл, из которого должна быть прочитана передача при загрузке.

значение должно быть ресурсом потока (например, с использованием fopen ()) для следующих значений параметра option:

Вы должны быть в состоянии вызвать fopen() для файла, который был загружен (см. Документацию относительно Обработка загрузки файлов ) Я не уверен, но вам, возможно, придется позвонить move_uploaded_file() для управляемый каталог на сервере перед вызовом fopen()

Например:

$ch = curl_init();

$file = fopen($_FILES['file-field-name']['tmp_name'], 'r');

// OTHER CURL CONFIGURATION
curl_setopt($ch, CURLOPT_INFILE, $file);

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