Prześlij plik za pomocą pliku pobierz zawartość

Zdaję sobie sprawę, że mogę to zrobić z CURL bardzo łatwo, ale zastanawiałem się, czy można użyć file_get_contents() z kontekstem strumienia http do przesłania pliku na zdalny serwer WWW, a jeśli tak, to jak?

Author: halfer, 2010-10-23

2 answers

Po pierwsze, pierwszą zasadą multipart Content-Type jest definiowanie granicy , która będzie używana jako ogranicznik między każdą częścią (ponieważ jak sama nazwa mówi, może ona zawierać wiele części). Granicą może być dowolny ciąg znaków, który nie jest zawarty w treści . Zazwyczaj używam znacznika czasu:

define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
Po zdefiniowaniu granicy, musisz wysłać ją z nagłówkiem Content-Type, aby powiedzieć serwerowi, jakiego delimitera należy się spodziewać:
$header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY;

Gdy to się skończy, musisz zbudować odpowiednią treść, która będzie zgodna ze specyfikacją HTTP i wysłanym nagłówkiem. Jak wiesz, publikując Plik z formularza, zwykle masz nazwę pola formularza. Zdefiniujemy:

// equivalent to <input type="file" name="uploaded_file"/>
define('FORM_FIELD', 'uploaded_file'); 

Następnie budujemy content body:

$filename = "/path/to/uploaded/file.zip";
$file_contents = file_get_contents($filename);    

$content =  "--".MULTIPART_BOUNDARY."\r\n".
            "Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"".basename($filename)."\"\r\n".
            "Content-Type: application/zip\r\n\r\n".
            $file_contents."\r\n";

// add some POST fields to the request too: $_POST['foo'] = 'bar'
$content .= "--".MULTIPART_BOUNDARY."\r\n".
            "Content-Disposition: form-data; name=\"foo\"\r\n\r\n".
            "bar\r\n";

// signal end of request (note the trailing "--")
$content .= "--".MULTIPART_BOUNDARY."--\r\n";

Jak widzisz, wysyłamy nagłówek {[8] } z usposobieniem form-data, wraz z parametrem name (nazwa pola formularza) i parametrem filename (Oryginalna nazwa pliku). Ważne jest również wysłanie nagłówka Content-Type z odpowiednim typem MIME, jeśli chcesz poprawnie wypełnić $_FILES[]['type'] coś.

Jeśli masz kilka plików do przesłania, po prostu powtórz proces z bitem $content, oczywiście z innym FORM_FIELD dla każdego pliku.

Teraz zbuduj kontekst:

$context = stream_context_create(array(
    'http' => array(
          'method' => 'POST',
          'header' => $header,
          'content' => $content,
    )
));

I wykonać:

file_get_contents('http://url/to/upload/handler', false, $context);

Uwaga: nie ma potrzeby kodowania pliku binarnego przed wysłaniem go. HTTP może obsługiwać binary dobrze.

 75
Author: netcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 14:10:46

Możesz wysłać zapytanie POST z nagłówkiem Content-Type: multipart/form-data i ręcznie zakodować plik jako multipart/form-data.

file_get_contents(URL, false, stream_context_create(array(
    'http' => array(
        'method'  => 'POST',
        'headers' => 'Content-Type: multipart/form-data'
        'content' => MULTIPART_ENCODED_FILE,
    ),
)));
 0
Author: NikiC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 13:39:00