2013-02-15 3 views
4

Я пытаюсь использовать Docverter для преобразования файлов LaTeX/markdown в PDF, но у меня возникли проблемы с использованием PHP для работы CURL to access Docverter via their API. Я знаю, что я не полный idiot b/c, я могу заставить это работать, адаптируя сценарий оболочки in this Docverter example и работая из командной строки (Mac OSX).Выполнение Curl с PHP

Использование РНР exec():

$url=$_SERVER["DOCUMENT_ROOT"]; 
$file='/markdown.md'; 
$output= $url.'/markdown_to_pdf.pdf'; 
$command="curl --form from=markdown \ 
       --form to=pdf \ 
       --form input_files[][email protected]".$url.$file." \ 
       http://c.docverter.com/convert > ".$output; 
exec("$command"); 

Это не дает никаких сообщений об ошибках, но не работает. Есть ли проблема?

UPDATE на основе @ предложению Джона, вот пример использования РНР curl_exec() адаптировано из here. К сожалению, это также не работает, хотя, по крайней мере, оно дает сообщения об ошибках.

$url = 'http://c.docverter.com/convert'; 
$fields_string =''; 
$fields = array('from' => 'markdown', 
     'to' => 'pdf', 
     'input_files[]' => $_SERVER['DOCUMENT_ROOT'].'/markdown.md', 
    ); 

    //url-ify the data for the POST 
    foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
    rtrim($fields_string, '&'); 

    //open connection 
    $ch = curl_init(); 

    //set the url, number of POST vars, POST data 
    curl_setopt($ch,CURLOPT_URL, $url); 
    curl_setopt($ch,CURLOPT_POST, count($fields)); 
    curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); 

    //execute post 
    $result = curl_exec($ch); 

    //close connection 
    curl_close($ch); 
+0

Пробовали ли вы 'shell_exec'? – Peon

+0

- @ Dainis, еще нет, я получил 'exec()' для работы над другими вещами и признаю, что не уверен в различии с 'shell_exec()'. Причина, по которой я не хочу запускать сценарий оболочки, заключается в том, что имена файлов и пути меняются, поэтому мне нужны переменные. –

+1

Почему вы не используете функции curl, написанные для PHP вместо exec? –

ответ

9

Я решил свою проблему. Существовали две основные проблемы с вышеуказанным кодом:

1) Массив $fields был неправильно отформатирован для input_files[]. Требовалось @/ и мим типа декларации (см код ниже)

2) В curl_exec() выход (фактические вновь созданные содержимого файлов), необходимых для быть возвращены, а не только true/false что поведение этой функции по умолчанию. Это достигается установкой параметра curl curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); (см. Код ниже).

Полный рабочий пример

//set POST variables 
$url = 'http://c.docverter.com/convert'; 
$fields = array('from' => 'markdown', 
    'to' => 'pdf', 
    'input_files[]' => "@/".realpath('markdown.md').";type=text/x-markdown; charset=UTF-8" 
    ); 

//open connection 
$ch = curl_init(); 

//set options 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data")); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //needed so that the $result=curl_exec() output is the file and isn't just true/false 

//execute post 
$result = curl_exec($ch); 

//close connection 
curl_close($ch); 

//write to file 
$fp = fopen('uploads/result.pdf', 'w'); //make sure the directory markdown.md is in and the result.pdf will go to has proper permissions 
fwrite($fp, $result); 
fclose($fp); 

 Смежные вопросы

  • Нет связанных вопросов^_^