2010-04-05 15 views
7

mit HTML-Formulare können wir eine Datei von einem Client auf einen Server mit enctype = "multipart/form-data", Eingabe Typ = "Datei" und so weiter hochladen.http Transfer-Datei vom Server zum Server

Gibt es eine Möglichkeit, eine Datei bereits auf dem Server zu haben und sie auf den gleichen Weg auf einen anderen Server zu übertragen?

Danke für Hinweise.

// WoW! Dies ist die schnellste Frage Antwort Seite, die ich je gesehen habe !!

Antwort

10

Wenn der Browser eine Datei auf den Server hochlädt, sendet er eine HTTP POST-Anfrage, die den Inhalt der Datei enthält.

Sie müssen das replizieren.


Mit PHP, der einfachste (oder zumindest am häufigsten verwendeten) Lösung wahrscheinlich mit curl zu arbeiten ist.

Wenn Sie einen Blick auf die Liste der Optionen nehmen Sie mit curl_setopt einstellen können, werden Sie sehen, dieses: CURLOPT_POSTFIELDS(Zitat):

Die vollständigen Daten in einem HTTP posten "POST" Operation.
Um eine Datei zu posten, geben Sie einen Dateinamen mit @ voran und verwenden Sie den vollständigen Pfad .
Dies kann entweder als urlencoded String übergeben, wie ‚para1 = Wert1 & para2 = val2 & ...‘ oder als Array mit dem Feldnamen als Schlüssel und Felddaten als Wert.
Wenn der Wert ein Array ist, wird der Content-Type-Header auf multipart/form-data gesetzt.


Nicht getestet, aber ich nehme an, dass so etwas wie dies den Trick tun sollte - oder zumindest, Sie beginnen zu helfen:

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

Grundsätzlich Sie:

  • verwenden curl
  • müssen Sie die Ziel-URL
  • Sie angeben wollen curl_exec das Ergebnis zurückzukehren, und nicht ausgegeben es
  • sind POST verwenden und nicht GET
  • werden einige Daten zu veröffentlichen, einschließlich einer Datei - beachten Sie die @ bevor der Pfad der Datei.
+0

Ich denke, das wird funktionieren und ich werde es versuchen! Danke :-) (Hey du hast den gleichen Vornamen dann ich also deine Antwort muss richtig sein ^^) – qualle

+0

Gern geschehen :-) viel Spaß! * (viele Leute mit unserem Namen, ich sehe ^^) * –

+0

+1, ich wusste nicht, es war so einfach wie mit dem '@' Symbol mit PHP :-) –

0

Ex. Wenn Sie eine Datei namens mypicture.gif auf Server A haben und diese an Server B senden möchten, können Sie CURL verwenden.

  1. Server A liest den Inhalt als String.
  2. Schreiben Sie die Zeichenfolge mit Curl auf Server B
  3. Server B den String und speichert sie als Datei mit dem Namen mypictyre-copy.gif

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

einige Beispiel-PHP-Code Siehe holt:

<?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 ist wahrscheinlich eine bessere Wahl als HTTP, wenn die Server unter Ihrer Kontrolle sind.

+0

Leider nicht – qualle

+0

FTP ist keine gute Wahl, da es schwierig ist, Firewalls und NAT-Gateways zu durchlaufen. Bleiben Sie bei HTTP oder verwenden Sie besser HTTPS. Erweiterte Lösungen berücksichtigen auch webdav, aber NIEMALS FTP! – Raven

+0

Wenn beide Server unter der Kontrolle des Fragestellers sind (wie ich in der Antwort gesagt habe), sehe ich nicht, wie Firewalls ein Problem sind? –

3

können Sie es auf die gleiche Weise tun. Nur dieses Mal ist der Server, der die Datei zuerst erhalten hat, der Client und der zweite Server ist Ihr Server. Versuchen Sie sich mit diesen:

für die Webseite auf dem zweiten Server:

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

Und als Skript die Datei auf dem ersten Server zu senden:

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

Beide Scripts werden von hier : http://www.coder-wiki.de/HowTos/PHP-POST-Request-Datei