Ho avuto un problema simile nel tentativo di inviare enormi file di ingestione alla bulk API di elasticsearch da PHP, fino a quando ho capito che l'endpoint dell'APP bulk accettava le richieste PUT. In ogni caso, questo codice esegue le richieste POST con file di grandi dimensioni:
$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);
Qui, $tmpFile
è il percorso completo del file contenente il corpo della richiesta.
NOTA: La parte importante è la creazione di CURLOPT_CUSTOMREQUEST
-'POST'
anche se CURLOPT_PUT
è impostato.
Dovresti adattare l'intestazione Content-Type:
a qualsiasi cosa il server si aspetti.
Utilizzando tcpdump, ho potuto confermare il metodo di richiesta di essere POST:
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...]
sto utilizzando pacchetti libcurl3 (versione 7.35.0-1ubuntu2.5) e PHP5-ricciolo (versione 5.5.9+ dfsg-1ubuntu4.11) su Ubuntu 14.04.
Per inviare un file su un server, provate questo: http://stackoverflow.com/questions/4223977/send-file-via-curl-from-form-post-in-php – silkfire