Arquivo de transferência HTTP do servidor para o servidor

Com formulários html podemos carregar um arquivo de um cliente para um servidor com enctype = “multipart / form-data”, input type = “file” e assim por diante.

Existe uma maneira de ter um arquivo já ligado ao servidor e transferi-lo para outro servidor da mesma maneira?

Obrigado por sugestões.

// Uau! Esta é a pergunta mais rápida que responde a página que já vi !!

Quando o navegador está carregando um arquivo para o servidor, ele envia uma solicitação HTTP POST, que contém o conteúdo do arquivo.

Você terá que replicar isso.

Com o PHP, a solução mais simples (ou, pelo menos, mais usada) é provavelmente trabalhar com curl .

Se você olhar para a lista de opções que pode configurar com curl_setopt , você verá esta: CURLOPT_POSTFIELDS (citando) :

Os dados completos para publicação em uma operação HTTP “POST”.
Para postar um arquivo, prepend um nome de arquivo com @ e use o caminho completo .
Isso pode ser passado como uma seqüência urlencoded como ‘para1 = val1 & para2 = val2 & …’ ou como uma matriz com o nome do campo como chave e dados de campo como valor.
Se o valor for uma matriz, o header Content-Type será definido como multipart / form-data.

Não testado, mas suponho que algo assim deve fazer o truque – ou, pelo menos, ajudá-lo a começar:

 $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); 

Basicamente, você:

  • estão usando curl
  • tem que definir o URL de destino
  • indicar que deseja curl_exec retornar o resultado e não curl_exec -lo
  • estão usando POST , e não GET
  • estão publicando alguns dados, incluindo um arquivo – anote o @ antes do caminho do arquivo.

Você pode fazê-lo da mesma maneira. Apenas desta vez seu servidor que recebeu o arquivo primeiro é o cliente e o segundo servidor é seu servidor. Tente usar estes:

Para a página da Web no segundo servidor:

  

E como um script para enviar o arquivo no primeiro 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); ?> 

Ambos os scripts são tirados daqui: http://www.coder-wiki.de/HowTos/PHP-POST-Request-Datei

O FTP é provavelmente uma escolha melhor do que o HTTP, se os servidores estiverem sob seu controle.

Ex. Se você tiver um arquivo chamado mypicture.gif no servidor A e deseja enviá-lo para o servidor B, você pode usar CURL.

  1. O servidor A lê o conteúdo como um String.
  2. Poste a string com CURL no Servidor B
  3. O servidor B obtém String e armazena-o como um arquivo chamado mypictyre-copy.gif

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

Alguns exemplos 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  $post = array( "file_box"=>"@/path/to/myfile.jpg", ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $response = curl_exec($ch); ?>