2013-03-19 15 views
5

czy istnieje sposób robieniaJak RAW POST ogromnego pliku XML z curl - PHP

curl -X POST -H "Content-Type:application/xml" --data @myfile.xml http://example.com 

ale bezpośrednio w PHP?

CURLOPT_PUT/CURLOPT_UPLOAD jak file_get_contents jak exec

nie stanowią rozwiązania, jak to musi być POST i plik jest ogromny, więc muszą być transmitowane.

Wszelkie pomysły?

+0

Aby umieścić plik na serwerze, spróbuj tego: http://stackoverflow.com/questions/4223977/send-file-via-curl-from-form-post-in-php – silkfire

Odpowiedz

1

Curl wspiera post, więc wierzę, szukasz czegoś takiego: Posting or Uploading Files Using Curl With PHP

// URL on which we have to post data 
$url = "http://localhost/tutorials/post_action.php"; 
// Any other field you might want to catch 
$post_data['name'] = "khan"; 
// File you want to upload/post 
$post_data['file'] = "@c:/logs.log"; 

// Initialize cURL 
$ch = curl_init(); 
// Set URL on which you want to post the Form and/or data 
curl_setopt($ch, CURLOPT_URL, $url); 
// Data+Files to be posted 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
// Pass TRUE or 1 if you want to wait for and catch the response against the request made 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// For Debug mode; shows up any error encountered during the operation 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
// Execute the request 
$response = curl_exec($ch); 

// Just for debug: to see response 
echo $response; 

(All kredytową dla kodu oryginalnego połączonego autora).

Co do "ogromnego", będziesz chciał być bardziej konkretny - kb, mb, gb, tb? Dodatkowe problemy będą związane z tym, jak długo skrypt PHP może pozostać przy życiu bez automatycznego kończenia, użycia pamięci skryptu (co może wymagać obsłużenia elementów w porcjach zamiast ładowania całego pliku), itp.

EDYCJA: Ah , dla Postu RAW myślę, że będziesz tego potrzebował wtedy: Raw POST using Curl in PHP

+0

czyli nie RAW POST z Content-Type: application/xml, jest to Content-Type: multipart/form-data. Ogromnie mam na myśli, że nie możesz załadować do pamięci – Marcin

+0

Ah, cóż, jeśli nie możesz załadować go do pamięci, to widzę co masz na myśli, żaden z nich nie zadziała jak curl_exec() będzie czekał aż skończysz, by wysłać - przez w którym momencie skrypt się zawiesił. – BrianHall

+0

Nie, jeśli możesz przesyłać strumieniowo, w taki sam sposób jak w przypadku zwykłego wpisu i @ – Marcin

12

Miałem podobny problem, próbując nakarmić ogromne pliki do spożywania elastycznego interfejsu API firmy elasticsearch z PHP, dopóki nie zdałem sobie sprawy, że większość akceptowanych żądań PPP API PUT. W każdym razie, ten kod wykonuje żądania POST z dużych plików:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_PUT, 1); 
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($tmpFile)); 
curl_setopt($curl, CURLOPT_INFILE, ($in=fopen($tmpFile, 'r'))); 
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ]); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($curl); 
curl_close($curl); 
fclose($in); 

Tutaj $tmpFile jest pełna ścieżka do pliku zawierającego treści żądania.

UWAGA: Ważną częścią jest ustawienie CURLOPT_CUSTOMREQUEST do 'POST' chociaż CURLOPT_PUT jest ustawiony.

Będziesz musiał dostosować nagłówek Content-Type: do tego, czego oczekuje serwer.

Korzystanie tcpdump, mogę potwierdzić metody żądania POST być:

POST /my_index/_bulk HTTP/1.1 
Host: 127.0.0.1:9200 
Accept: */* 
Content-Type: application/json 
Content-Length: 167401 
Expect: 100-continue 

[...snip...] 

używam pakiety libcurl3 (wersja 7.35.0-1ubuntu2.5) i php5-curl (wersja 5.5.9+ dfsg-1ubuntu4.11) na Ubuntu 14.04.

+1

+1 do weryfikacji za pomocą tcpdump. Ustawianie opcji i ufanie, że to wszystko, co musiałem zrobić (tzn. Opcje nigdy nie są w konflikcie, kolejność opcji jest nieistotna, * et cetera *) ugryzło mnie więcej niż raz. – LSerni

+0

Cóż, jestem trochę nieswojo ze sprzecznymi opcjami, dlatego wymieniłem wersje pakietów. W moim przypadku "CURLOPT_CUSTOMREQUEST" zastępuje inne opcje, ale nie jestem pewien, czy działa * zgodnie z przeznaczeniem * i jest trwałym rozwiązaniem. – Shadocko

+0

Wielkie dzięki! Publikuję/umieszczam nieprzetworzone dane plików bezpośrednio na API, a podczas gdy PUT było łatwe przy użyciu CURLOPT_INFILE, nie mogłem znaleźć sposobu, aby uzyskać POST do pracy, ponieważ zawsze używa on wieloczęściowych danych formularzy. To była dokładnie ta część, której mi brakowało - po prostu ustaw niestandardową prośbę na POST. – phansen