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> </td>
<td align="center"> </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);