Foros del Web » Programando para Internet » PHP »

APORTE: POST a paginas externas

Estas en el tema de APORTE: POST a paginas externas en el foro de PHP en Foros del Web. Hay ocasiones en las que deseamos poder hacer un "formulario" sin formularios, osea... simular un envío por POST hacia otra pagina, usando solo PHP. En ...
  #1 (permalink)  
Antiguo 29/07/2009, 23:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
APORTE: POST a paginas externas

Hay ocasiones en las que deseamos poder hacer un "formulario" sin formularios, osea... simular un envío por POST hacia otra pagina, usando solo PHP.

En esta ocasión estoy usando sockets, basándome en un ejemplo de la misma pagina de php. Soporta variables GET, POST y FILES.

La utilidad de esta funcion es muy amplia, solo basta intentarlo.

Código PHP:
/**
 * Enviar POST
 *
 * Esta funcion intentara enviar un paquete POST hacia
 * la URL especificada, incluso archivos.
 *
 * <b>NOTE</b> que en caso de fallar algo, se
 * devolvera <b>FALSE</b>.
 *
 * @link http://www.php.net/manual/en/function.fsockopen.php#39868
 * @param string $url URL destino
 * @param string $args Variables
 * @param string $files Archivos
 * @return mixed
 */
function upload($url$args = array(), $files = array())
{
    if ( ! 
preg_match('/^[a-z]{2,6}:\/\/\S+$/'$url)) return FALSE;
    elseif ( ! 
is_callable('fsockopen')) return FALSE;

    
// reparamos...
    
$test parse_url($url);

    
$path = ! empty($test['path'])? $test['path']: '/';
    
$path .= ! empty($test['query'])? '?' $test['query']: '';


    
$resource fsockopen($test['host'], ! empty($test['port'])? $test['port']: 80);
    if ( ! 
$resource) return FALSE;

    
$boundary '---------------------------'
                        
substr(md5(uniqid('')), 013);
    
$output "--$boundary";


    
// query
    
if ( ! empty($args))
    {
        foreach ((array) 
$args as $name => $value)
        {
            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"';
            
$output .= "\r\n\r\n$value\r\n--$boundary";
        }
    }

    
// upload
    
if ( ! empty($files))
    {
        foreach ((array) 
$files as $name => $set)
        {
//--
            
$data file_get_contents($set[0]);
            
$name is_numeric($name)? $set[0]: $name;

            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"; filename="' $set[0] . '"';
            
$output .= "\r\nContent-Type: " $set[1];
            
$output .= "\r\n\r\n$data\r\n--$boundary";
        }
    }

    
$output .= "--\r\n\r\n";



    
//HTTP =>
    
fputs($resource"POST $path HTTP/1.0\r\n");

    
fputs($resource"Content-Type: multipart/form-data; boundary=$boundary\r\n");
    
fputs($resource'Content-Length: ' strlen($output) . "\r\n");
    
fputs($resource"Connection: close\r\n\r\n");
    
fputs($resource"{$output}\r\n");//--


    
$output '';
    while( ! 
feof($resource)) $output .= fgets($resource4096);
    return 
$output;


ejemplo
Código PHP:
var_dump(upload(
  
'http://localhost/upload.php',
  array(
    
'input_text' => 'Foo',
    
'input_check' => 'on'
  
),
  array(
    
'input_file' => array('bar.dat''text/plain'),
    
'input_file2' => array('candy.gif''image/gif'),
    
'this_file' => array(__FILE__'application/octet-stream')
  )
)); 
upload.php
Código PHP:
<h1>It works!</h1>
<?php
echo '<pre>';
print_r($_GETTRUE);
print_r($_POSTTRUE);
print_r($_FILESTRUE);
echo 
'</pre>';

Edito: me fui a dormir, pero si... es file_get_contents() y no read()

suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 30/07/2009 a las 09:13 Razón: ejemplo...
  #2 (permalink)  
Antiguo 30/07/2009, 07:51
Avatar de ACX_POISON  
Fecha de Ingreso: abril-2008
Ubicación: Talca-Chile
Mensajes: 750
Antigüedad: 16 años, 7 meses
Puntos: 7
mmm....

que interezante voy a probar de inmediato..

Se Agradece...

sabes tengo un problema estoy probando tal cual

Código PHP:
<?php
/**
 * Enviar POST
 *
 * Esta funcion intentara enviar un paquete POST hacia
 * la URL especificada, incluso archivos.
 *
 * <b>NOTE</b> que en caso de fallar algo, se
 * devolvera <b>FALSE</b>.
 *
 * @link http://www.php.net/manual/en/function.fsockopen.php#39868
 * @param string $url URL destino
 * @param string $args Variables
 * @param string $files Archivos
 * @return mixed
 */
function upload($url$args = array(), $files = array())
{
    if ( ! 
preg_match('/^[a-z]{2,6}:\/\/\S+$/'$url)) return FALSE;
    elseif ( ! 
is_callable('fsockopen')) return FALSE;

    
// reparamos...
    
$test parse_url($url);

    
$path = ! empty($test['path'])? $test['path']: '/';
    
$path .= ! empty($test['query'])? '?' $test['query']: '';


    
$resource fsockopen($test['host'], ! empty($test['port'])? $test['port']: 80);
    if ( ! 
$resource) return FALSE;

    
$boundary '---------------------------'substr(md5(uniqid('')), 013);
    
$output "--$boundary";


    
// query
    
if ( ! empty($args))
    {
        foreach ((array) 
$args as $name => $value)
        {
            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"';
            
$output .= "\r\n\r\n$value\r\n--$boundary";
        }
    }

    
// upload
    
if ( ! empty($files))
    {
        foreach ((array) 
$files as $name => $set)
        {
//--
            
$data read($set[0]);//aqui me da error
            
$name is_numeric($name)? $set[0]: $name;

            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"; filename="' $set[0] . '"';
            
$output .= "\r\nContent-Type: " $set[1];
            
$output .= "\r\n\r\n$data\r\n--$boundary";
        }
    }

    
$output .= "--\r\n\r\n";



    
//HTTP =>
    
fputs($resource"POST $path HTTP/1.0\r\n");

    
fputs($resource"Content-Type: multipart/form-data; boundary=$boundary\r\n");
    
fputs($resource'Content-Length: ' strlen($output) . "\r\n");
    
fputs($resource"Connection: close\r\n\r\n");
    
fputs($resource"{$output}\r\n");//--


    
$output '';
    while( ! 
feof($resource)) $output .= fgets($resource4096);
    return 
$output;
}  

//////////////////////////////////////////////////////////////////////
var_dump(upload(
  
'http://localhost:256/pruebas_php/pruebas_fsocket/upload.php',
  array(
    
'input_text' => 'Foo',
    
'input_check' => 'on'
  
),
  array(
    
'input_file' => array('prueba.txt''text/plain'),
    
//'input_file2' => array('candy.gif', 'image/gif'), *solo un archivo
    
'this_file' => array(__FILE__'application/octet-stream')
  )
));  
?>
pero me da un error en la linea 52 ( $data = read($set[0]);//aqui me da error) que read no esta definida como funcion, no sera fread ¿?..

PD: me intereza probar este sistema .
__________________
Me junto con los que Saben, Queriendo Saber.

Última edición por GatorV; 30/07/2009 a las 10:02
  #3 (permalink)  
Antiguo 30/07/2009, 08:32
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: APORTE: POST a paginas externas

excelente aporte!
  #4 (permalink)  
Antiguo 30/07/2009, 08:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: APORTE: POST a paginas externas

Debe de ser una función de él, prueba cambiarla por file_get_contents.

Saludos.
  #5 (permalink)  
Antiguo 30/07/2009, 08:43
Avatar de ACX_POISON  
Fecha de Ingreso: abril-2008
Ubicación: Talca-Chile
Mensajes: 750
Antigüedad: 16 años, 7 meses
Puntos: 7
vale... GatorV voy a probar....

Gracias GatorV

en resumen asi quedo y funciona
Código PHP:
<?php
/**
 * Enviar POST
 *
 * Esta funcion intentara enviar un paquete POST hacia
 * la URL especificada, incluso archivos.
 *
 * <b>NOTE</b> que en caso de fallar algo, se
 * devolvera <b>FALSE</b>.
 *
 * @link http://www.php.net/manual/en/function.fsockopen.php#39868
 * @param string $url URL destino
 * @param string $args Variables
 * @param string $files Archivos
 * @return mixed
 */
function upload($url$args = array(), $files = array())
{
    if ( ! 
preg_match('/^[a-z]{2,6}:\/\/\S+$/'$url)) return FALSE;
    elseif ( ! 
is_callable('fsockopen')) return FALSE;

    
// reparamos...
    
$test parse_url($url);

    
$path = ! empty($test['path'])? $test['path']: '/';
    
$path .= ! empty($test['query'])? '?' $test['query']: '';


    
$resource fsockopen($test['host'], ! empty($test['port'])? $test['port']: 80);
    if ( ! 
$resource) return FALSE;

    
$boundary '---------------------------'substr(md5(uniqid('')), 013);
    
$output "--$boundary";


    
// query
    
if ( ! empty($args))
    {
        foreach ((array) 
$args as $name => $value)
        {
            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"';
            
$output .= "\r\n\r\n$value\r\n--$boundary";
        }
    }

    
// upload
    
if ( ! empty($files))
    {
        foreach ((array) 
$files as $name => $set)
        {
//--
            
$data =file_get_contents($set[0]);
            
//$data = read($set[0]);//aqui me da error
            
$name is_numeric($name)? $set[0]: $name;

            
$output .= "\r\nContent-Disposition: form-data; name=\""
                            
$name '"; filename="' $set[0] . '"';
            
$output .= "\r\nContent-Type: " $set[1];
            
$output .= "\r\n\r\n$data\r\n--$boundary";
        }
    }

    
$output .= "--\r\n\r\n";



    
//HTTP =>
    
fputs($resource"POST $path HTTP/1.0\r\n");

    
fputs($resource"Content-Type: multipart/form-data; boundary=$boundary\r\n");
    
fputs($resource'Content-Length: ' strlen($output) . "\r\n");
    
fputs($resource"Connection: close\r\n\r\n");
    
fputs($resource"{$output}\r\n");//--


    
$output '';
    while( ! 
feof($resource)) $output .= fgets($resource4096);
    return 
$output;
}  

//////////////////////////////////////////////////////////////////////
var_dump(upload(
  
'http://localhost:256/pruebas_php/pruebas_fsocket/upload.php',
  array(
    
'input_text' => 'Foo',
    
'input_check' => 'on'
  
),
  array(
    
'input_file' => array('prueba.txt''text/plain'),
    
//'input_file2' => array('candy.gif', 'image/gif'),
    
'this_file' => array(__FILE__'application/octet-stream')
  )
));  
?>
__________________
Me junto con los que Saben, Queriendo Saber.

Última edición por GatorV; 30/07/2009 a las 10:05

Etiquetas: aportes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 15:31.