script rellenar para hacer google formularios formulario encuestas como automaticamente autollenado php curl multipartform-data

php - hacer - robot para rellenar formularios web



PublicaciĆ³n de datos de imagen sin formato como multiparte/datos de formulario en curl (2)

En caso de que alguien tenga el mismo problema: verifique esto como se sugirió @PravinS. Usé exactamente el mismo código que se muestra allí y me funcionó a la perfección.

Esta es la parte relevante del código del servidor que ayudó:

if (isset($_POST[''btnUpload''])) { $url = "URL_PATH of upload.php"; // e.g. http://localhost/myuploader/upload.php // request URL $filename = $_FILES[''file''][''name'']; $filedata = $_FILES[''file''][''tmp_name'']; $filesize = $_FILES[''file''][''size'']; if ($filedata != '''') { $headers = array("Content-Type:multipart/form-data"); // cURL headers for file uploading $postfields = array("filedata" => "@$filedata", "filename" => $filename); $ch = curl_init(); $options = array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_POST => 1, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => $postfields, CURLOPT_INFILESIZE => $filesize, CURLOPT_RETURNTRANSFER => true ); // cURL options curl_setopt_array($ch, $options); curl_exec($ch); if(!curl_errno($ch)) { $info = curl_getinfo($ch); if ($info[''http_code''] == 200) $errmsg = "File uploaded successfully"; } else { $errmsg = curl_error($ch); } curl_close($ch); } else { $errmsg = "Please select the file"; } }

La forma html debería verse más o menos así:

<form action="uploadpost.php" method="post" name="frmUpload" enctype="multipart/form-data"> <tr> <td>Upload</td> <td align="center">:</td> <td><input name="file" type="file" id="file"/></td> </tr> <tr> <td>&nbsp;</td> <td align="center">&nbsp;</td> <td><input name="btnUpload" type="submit" value="Upload" /></td> </tr>

Estoy tratando de publicar una imagen con cURL en PHP usando encabezado multipart / form-data ya que la API a la que estoy enviando espera que la imagen se envíe como formulario de varias partes.

No tengo problemas para hablar con la API con otras solicitudes; solo publicar una imagen es un problema.

Estoy usando esta forma en el lado del cliente:

<form action="http://myServerURL" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="Submit"> </form>

y este es el servidor en el que estoy publicando (aquí estoy intentando publicar estos datos en una API):

$ch = curl_init($url); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, $imgRawData); // <-- raw data here hm? curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookieJar); curl_setopt( $ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLINFO_HEADER_OUT, 1); <-- using this as I wanted to check if HTTPHEADER is set curl_setopt($ch, CURLOPT_HTTPHEADER, array(''Content-Type: multipart/form-data'')); <-- setting content-type header? curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); // i get response from the server $response = curl_exec( $ch ); // with this I can check what kind of content type the last request had? $requestContentType = curl_getinfo($ch,CURLINFO_CONTENT_TYPE); echo "<br>request Content Type was:".$requestContentType."<br>"; curl_close($ch); echo "<br><b>SERVER POST IMAGE RESPONSE:</b><br>"; echo $response;

Con el código a continuación, puedo ver mis encabezados de solicitud:

curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLINFO_HEADER_OUT, true); var_dump(curl_getinfo($ch));

El tipo de contenido en los encabezados de solicitud ahora se muestra correctamente. Pero parece que la imagen no se envía correctamente como esperaría API. Lamentablemente, no tengo acceso a la API ...

Cualquier ayuda apreciada, gracias


A partir de PHP 5.6 @$filePath no funcionará en CURLOPT_POSTFIELDS sin que se establezca CURLOPT_SAFE_UPLOAD y se elimine por completo en PHP 7. Tendrá que utilizar un objeto CurlFile , RFC aquí .

$fields = [ ''name'' => new /CurlFile($filePath, ''image/png'', ''filename.png'') ]; curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);