file di trasferimento http da server a server

con i moduli html possiamo caricare un file da un client a un server con enctype = "multipart / form-data", input type = "file" e così via.

C'è un modo per avere un file già sul server e trasferirlo su un altro server allo stesso modo?

Grazie per i suggerimenti.

// Wow! Questa è la pagina di risposta alle domande più veloce che abbia mai visto !!

Quando il browser carica un file sul server, invia una richiesta HTTP POST, che contiene il contenuto del file.

Te lo ripeterai.

Con PHP, la soluzione più semplice (o, alless, più utilizzata) è probabilmente quella di lavorare con il curl .

Se dai un'occhiata all'elenco delle opzioni che puoi impostare con curl_setopt , vedrai questo: CURLOPT_POSTFIELDS (quoting) :

I dati completi da pubblicare in un'operazione HTTP "POST".
Per pubblicare un file, anteporre un nome file con @ e utilizzare il path completo .
Questo può essere passato come una string urlencoded come 'para1 = val1 & para2 = val2 & …' o come arrays con il nome del field come chiave e dati del field come valore.
Se value è un arrays, l'intestazione Content-Type sarà impostata su multipart / form-data.

Non testato, ma suppongo che una cosa del genere dovrebbe fare il trucco o, alless, aiutarti a iniziare:

 $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, arrays( 'file' => '@/..../file.jpg', // you'll have to change the name, here, I suppose // some other fields ? )); $result = curl_exec($ch); curl_close($ch); 

Fondamentalmente, tu:

  • stanno usando arricciatura
  • devi impostare l'URL di destinazione
  • indica che vuoi che curl_exec restituisca il risultato e non lo curl_exec
  • stanno usando POST , e non GET
  • stanno postando alcuni dati, incluso un file – nota @ prima del path del file.

puoi farlo allo stesso modo. Proprio questa volta il tuo server che ha ricevuto prima il file è il client e il secondo server è il tuo server. Prova a usare questi:

Per la pagina web sul secondo server:

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

E come script per submit il file sul primo server:

 <?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 = arrays('var1'=>'test', 'var2'=>'test'); $data = file_get_contents('Signatur.jpg'); $filedata = arrays('inputname', 'filename.jpg', $data); echo PostToHost ("localhost", 80, "/test3.php", $postdata, $filedata); ?> 

Entrambi gli script sono presi da qui: http://www.coder-wiki.de/HowTos/PHP-POST-Request-Datei

L'FTP è probabilmente una scelta migliore di HTTP, se i server sono entrambi sotto il tuo controllo.

Ex. se hai un file chiamato mypicture.gif sul server A e vuoi inviarlo al server B, puoi usare CURL.

  1. Il server A legge il contenuto come una string.
  2. Pubblica la string con CURL sul server B
  3. Il server B recupera la string e la memorizza come un file chiamato mypictyre-copy.gif

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

Alcuni esempi di codice 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 = arrays( "file_box"=>"@/path/to/myfile.jpg", ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $response = curl_exec($ch); ?>