Is there a way to send a file via file_get_contents without manually manipulating the request header?
Is there a way to send a file via file_get_contents without manually manipulating the request header?
To make requests with the POST method, you need to use the stream_context_create .
See documentation for file_get_contents .
Note that there are examples of usage in the comments.
Let's look at an example use:
<?php
// Você irá enviar um cabeçalho para que a aplicação saiba que existem diversas
// informações no mesmo corpo da requisição. Para separar uma informação de outra
// você usará um delimitador. Este delimitador não deve aparecer no conteúdo das
// demais informações. Para ilustrar, vamos deixar simples:
$delimitador = "MY-DELIMITER";
$cabechalho = "Content-Type: multipart/form-data; boundary=$delimitador";
// Agora você pega o conteúdo do arquivo que quer enviar. Não precisa ser, necessariamente,
// um arquivo no sistema de arquivos. Você pode querer enviar um json, por exemplo,
// ou um CSV que tenha construído anteriormente. Neste caso pegaremos um arquivo
// no mesmo diretório do arquivo atual
$fileContent = file_get_contents(__DIR__ . "/file.txt");
// Agora é a hora de montar o corpo da requisição. No exemplo abaixo estou enviando
// duas informações: um campo chamado "somedata" com o valor "form"
// (similar a ter um <input name="somedata" value="foo" /> no browser)
// e um arquivo identificado com o nome "file.txt"
// Nota: perceba a disposição correnta do delimitador e das quebras de linha
$requestContent = <<<CONTENT
--{$delimitador}
Content-Disposition: form-data; name="somedata"
foo
--{$delimitador}
Content-Disposition: form-data; name="file"; filename="file.txt""
{$fileContent}
--{$delimitador}
CONTENT;
// Agora é hora de fazer a request. Para o exemplo, estou escrevendo o resultado
// da request na tela. O arquivo de destino contém um print_r das globais $_REQUEST e $_FILES
// e do conteúdo do arquivo recebido
var_dump(file_get_contents(
"http://localhost/demo/post.php",
false,
stream_context_create([
'http' => [
'method' => 'POST',
'header' => $cabechalho,
'content' => $requestContent
]
])
));
// Você deve ver algo como:
// 'Array
// (
// [0] => Array
// (
// [somedata] => foo
// )
//
// [1] => Array
// (
// [file] => Array
// (
// [name] => file.txt
// [type] =>
// [tmp_name] => /tmp/phpZTXmfR
// [error] => 0
// [size] => 19
// )
//
// )
//
// [2] => This is the file :)
// )
// '