2010-04-05 22 views
7

con formularios html podemos cargar un archivo de un cliente a un servidor con enctype = "multipart/form-data", input type = "file" y así sucesivamente.http archivo de transferencia del servidor al servidor

¿Hay alguna manera de tener un archivo EN EL servidor y transferirlo a otro servidor de la misma manera?

Gracias por los consejos.

// ¡WoW! ¡Esta es la página de preguntas más rápida que he visto!

Respuesta

10

Cuando el navegador carga un archivo en el servidor, envía una solicitud HTTP POST, que contiene el contenido del archivo.

Tendrás que replicar eso.


Con PHP, el más simple (o, al menos, más utilizado) solución es, probablemente, para trabajar con curl.

Si se echa un vistazo a la lista de opciones que se pueden ajustar curl_setopt, verá la siguiente: CURLOPT_POSTFIELDS(citando):

Los datos completos para publicar en un HTTP Operación "POST" .
Para publicar un archivo, anteponga un nombre de archivo con @ y use la ruta completa .
Esto se puede pasa como una cadena urlencoded como 'párrafo1 = val1 val2 = párrafo2 & & ...' o como una matriz con el nombre del campo como datos clave y de campo como valor.
Si el valor es una matriz, el encabezado Content-Type será se establecerá en multipart/form-data.


No se ha probado, pero supongo que algo así debe hacer el truco - o, al menos, ayudarle a empezar:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/your-destination-script.php"); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
     'file' => '@/..../file.jpg', 
     // you'll have to change the name, here, I suppose 
     // some other fields ? 
)); 
$result = curl_exec($ch); 
curl_close($ch); 

Básicamente, usted:

  • están usando curl
  • tienen que establecer la URL de destino
  • indicarte curl_exec desee devolver el resultado, y no de salida que
  • están utilizando POST y no GET
  • están publicando algunos datos, incluyendo un archivo - nota del @ antes de la ruta del archivo.
+0

¡Creo que esto va a funcionar y lo intentaré! Gracias :-) (Oye, tienes el mismo nombre que yo entonces tu respuesta debe ser correcta ^^) – qualle

+0

De nada :-) diviértete! * (Mucha gente con nuestro nombre, veo ^^) * –

+0

+1, no me di cuenta que era tan simple como usar el símbolo '@' con PHP :-) –

0

Ej. si tiene un archivo llamado mypicture.gif en el servidor A y desea enviarlo al servidor B, puede usar CURL.

  1. El servidor A lee el contenido como una cadena.
  2. Deja la cadena con CURL al servidor B
  3. servidor B recupera la cadena y lo almacena como un archivo llamado mypictyre-copy.gif

Ver http://php.net/manual/en/book.curl.php

algunos ejemplos de código PHP:

<?php 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_VERBOSE, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); 
    curl_setopt($ch, CURLOPT_URL, _VIRUS_SCAN_URL); 
    curl_setopt($ch, CURLOPT_POST, true); 
    // same as <input type="file" name="file_box"> 
    $post = array(
     "file_box"=>"@/path/to/myfile.jpg", 
    ); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    $response = curl_exec($ch); 
?> 
0

FTP es probablemente una mejor opción que HTTP, si los servidores están bajo su control.

+0

Desafortunadamente, no – qualle

+0

FTP no es una buena opción ya que es problemático atravesar cortafuegos y puertas de enlace NAT. Seguir con HTTP o incluso mejor utilizar HTTPS. Las soluciones avanzadas también tienen en cuenta webdav, ¡pero NUNCA FTP! – Raven

+0

Si ambos servidores están bajo el control de los solicitantes (como dije en la respuesta), ¿no veo cómo los cortafuegos son un problema? –

3

puede hacerlo de la misma manera. Solo que esta vez su servidor que recibió el archivo primero es el cliente y el segundo servidor es su servidor. Trate de usar estos:

Para la página web en el segundo servidor:

<form> 
     <input type="text" name="var1" /> 
     <input type="text" name="var2" /> 
     <input type="file" name="inputname" /> 
     <input type="submit" /> 
    </form> 

Y como una secuencia de comandos para enviar el archivo en el primer servidor:

<?php 
function PostToHost($host, $port, $path, $postdata, $filedata) { 
    $data = ""; 
    $boundary = "---------------------".substr(md5(rand(0,32000)),0,10); 
    $fp = fsockopen($host, $port); 

    fputs($fp, "POST $path HTTP/1.0\n"); 
    fputs($fp, "Host: $host\n"); 
    fputs($fp, "Content-type: multipart/form-data; boundary=".$boundary."\n"); 

    // Ab dieser Stelle sammeln wir erstmal alle Daten in einem String 
    // Sammeln der POST Daten 
    foreach($postdata as $key => $val){ 
     $data .= "--$boundary\n"; 
     $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n"; 
    } 
    $data .= "--$boundary\n"; 

    // Sammeln der FILE Daten 
    $data .= "Content-Disposition: form-data; name=\"{$filedata[0]}\"; filename=\"{$filedata[1]}\"\n"; 
    $data .= "Content-Type: image/jpeg\n"; 
    $data .= "Content-Transfer-Encoding: binary\n\n"; 
    $data .= $filedata[2]."\n"; 
    $data .= "--$boundary--\n"; 

    // Senden aller Informationen 
    fputs($fp, "Content-length: ".strlen($data)."\n\n"); 
    fputs($fp, $data); 

    // Auslesen der Antwort 
    while(!feof($fp)) { 
     $res .= fread($fp, 1); 
    } 
    fclose($fp); 

    return $res; 
} 

$postdata = array('var1'=>'test', 'var2'=>'test'); 
$data = file_get_contents('Signatur.jpg'); 
$filedata = array('inputname', 'filename.jpg', $data); 

echo PostToHost ("localhost", 80, "/test3.php", $postdata, $filedata); 
?> 

Ambas secuencias de comandos se toman de aquí : http://www.coder-wiki.de/HowTos/PHP-POST-Request-Datei

Cuestiones relacionadas