Загрузить текст в виде файла с POST (multipart / form-data), используя php и curl - PullRequest
2 голосов
/ 22 мая 2009

API, который я пытаюсь реализовать, требует загрузки файла XML, содержащего команды. Простой способ сделать это - сгенерировать содержимое файла, записать его в файловую систему и загрузить с помощью curl на веб-сервер.

То, что я пытаюсь сделать, это пропустить часть записи, используя обработчик временного протокола php. Пример кода следующий:

<?php
  $fp = fopen("php://temp", "r+");

  $request = 'some xml here';
  fwrite($fp, $request);

  rewind($fp);

  $input_stat = fstat($fp);
  $size = $input_stat['size'];

  $url = "http://example.com/script.php";
  $ch = curl_init();

  $filename = $_POST[cert_file] ;
  $data['file'] = "@xml.xml";

  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST,1);
  curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
  curl_setopt($ch,CURLOPT_INFILESIZE,$size);
  curl_setopt($ch,CURLOPT_INFILE,$fp);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
  $result = curl_exec($ch);
  $error = curl_error($ch);

  echo 'result:'.$result."\n";
  echo 'error:'.$error."\n";

  curl_close($ch);
?>

К сожалению, это не работает. Tcpdump показывает, что запрос не отправляется. Обновление : Результат, который я получаю:

результат:

ошибка: не удалось создать промежуточные данные

У кого-нибудь есть подсказка, как загрузить текст в виде файла на лету с помощью PHP?

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Возможно, потому что после записи в $fp указатель дескриптора файла указывает на конец файла. Вы пытались сначала перемотать его?

fseek($fp, 0, SEEK_SET);
1 голос
/ 22 мая 2009

После вызова на fwrite добавьте вызов на rewind($fp). После fwrite указатель файла находится в конце временного потока. Если вы звоните rewind, он сбрасывает его в начало. Вот краткое доказательство из сессии PHP:

php > $fp = fopen("php://temp", "r+");
php > fputs($fp, "<xml>some xml</xml>\n");
php > echo stream_get_contents($fp);
php > rewind($fp);
php > echo stream_get_contents($fp);
<xml>some xml</xml>
php > exit

После первого эха stream_get_contents ничего не было отражено. После rewind второй эхо-сигнал stream_get_contents показал XML.

...