Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/07/2009, 23:45
Avatar de pateketrueke
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...