Php ve curl kullanarak POST (multipart / form-data) ile dosya olarak metni yüklemek

2 Cevap php

The API, I'm trying to implement requires the upload of XML file, containing the commands. The straightforward way to do this is to generate the content of the file, write it on the file system and upload it with curl to the web server.

Ben başarmak için çalışıyorum php geçici protokol işleyicisi kullanarak yazma bölümünü atlamak etmektir. Örnek kod aşağıda:

<?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 'sonuç:'.$result."\n";
  echo 'error:'.$error."\n";

  curl_close($ch);
?>

Unfortunately this doesn't work. Tcpdump shows that no request is being send. Update: The result I get is:

sonuç:

error: formpost veri oluşturma başarısız oldu

Herkes PHP ile anında dosya olarak metni yüklemek için nasıl bir ipucu var mı?

2 Cevap

Çağrısından sonra fwrite, rewind($fp) bir çağrı ekleyin. Sonra fwrite, dosya işaretçisi geçici akışının sonunda. Eğer ararsanız rewind bu başına sıfırlar. Burada bir PHP oturum hızlı bir kanıtıdır:

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

İlk yankı sonra stream_get_contents, hiçbir şey yankılandı. Ve rewind, ikinci eko sonra, stream_get_contents XML gösterdi.

Muhtemelen bu, çünkü $fp dosya sapın işaretçisi dosyanın sonuna işaret yazdıktan sonra. Önce bunu sarma denediniz mi?

fseek($fp, 0, SEEK_SET);