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