Send POST file with php using the file_get_contents function

0

Is there a way to send a file via file_get_contents without manually manipulating the request header?

    
asked by anonymous 01.06.2017 / 00:52

1 answer

2

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 :)
// )
// '
    
01.06.2017 / 02:51