Form com envio de arquivos por CURL para servidor secundário

Este é um exemplo completo que permitirá que você faça o upload de um arquivo em um formulário local e, em seguida, envie esse arquivo para outro servidor usando cURL. Vamos criar dois arquivos: index.html para o formulário local e enviaArquivo.php para receber o arquivo no servidor remoto.

  1. index.html (Formulário Local)
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Enviar Arquivo</title>
</head>
<body>
    <h1>Formulário de Envio de Arquivo</h1>
    <form method="post" enctype="multipart/form-data" action="enviar.php">
        <div>
            <label for="arquivo">Selecione um arquivo:</label>
            <input type="file" name="arquivo" id="arquivo" required>
        </div>
        <div>
            <label for="descricao">Descrição:</label>
            <textarea name="descricao" id="descricao" rows="4" cols="50"></textarea>
        </div>
        <div>
            <input type="submit" value="Enviar">
        </div>
    </form>
</body>
</html>
  1. enviar.php (Receber o Arquivo no Servidor Local e Enviar via cURL)
<?php
// Verifica se algum arquivo foi enviado
if (isset($_FILES['arquivo']) && !empty($_FILES['arquivo']['name'])) {
    // Define o diretório onde o arquivo será temporariamente armazenado (pode ser ajustado conforme necessário)
    $diretorio_temporario = '/caminho/para/diretorio_temporario/';

    // Verifica se o diretório temporário existe, se não, cria-o
    if (!is_dir($diretorio_temporario)) {
        mkdir($diretorio_temporario, 0755, true);
    }

    // Define o caminho completo para salvar o arquivo temporariamente (diretório temporário + nome do arquivo original)
    $caminho_temporario = $diretorio_temporario . $_FILES['arquivo']['name'];

    // Move o arquivo para o diretório temporário
    if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $caminho_temporario)) {
        // Arquivo recebido e salvo temporariamente com sucesso
        echo 'Arquivo recebido e salvo temporariamente com sucesso!';

        // Dados adicionais a serem enviados junto com o arquivo via cURL (pode ser ajustado conforme necessário)
        $descricao = $_POST['descricao'];

        // URL do servidor remoto que receberá o arquivo (ajuste conforme a URL do seu servidor remoto)
        $url_servidor_remoto = 'https://seu_servidor_remoto.com.br/enviaArquivo.php';

        // Criação de um arquivo temporário com o CURLFile (necessário para enviar o arquivo via cURL)
        $arquivo_curl = new CURLFile($caminho_temporario, $_FILES['arquivo']['type'], $_FILES['arquivo']['name']);

        // Dados adicionais que serão enviados junto com o arquivo via cURL (ajuste conforme necessário)
        $dados_adicionais = array(
            'descricao' => $descricao,
            // Você pode adicionar mais dados aqui, se necessário
        );

        // Inicia a sessão cURL
        $ch = curl_init();

        // Define as opções para o cURL
        curl_setopt($ch, CURLOPT_URL, $url_servidor_remoto);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $dados_adicionais + array('arquivo' => $arquivo_curl));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // Executa a requisição cURL
        $resultado = curl_exec($ch);

        // Verifica se houve algum erro na requisição cURL
        if (curl_errno($ch)) {
            echo 'Erro na requisição cURL: ' . curl_error($ch);
        } else {
            // Exibe a resposta do servidor remoto
            echo 'Resposta do servidor remoto: ' . $resultado;
        }

        // Fecha a sessão cURL
        curl_close($ch);

        // Remove o arquivo temporário após o envio
        unlink($caminho_temporario);
    } else {
        // Erro ao salvar o arquivo temporariamente
        echo 'Erro ao salvar o arquivo temporariamente!';
    }
} else {
    // Nenhum arquivo enviado
    echo 'Nenhum arquivo foi enviado!';
}
?>

Neste exemplo, o arquivo index.html contém o formulário que permite ao usuário selecionar um arquivo e inserir uma descrição. Quando o formulário é enviado, o arquivo é temporariamente armazenado em um diretório local temporário.

Em seguida, o arquivo enviar.php recebe o arquivo temporariamente armazenado, prepara os dados adicionais a serem enviados e envia o arquivo via cURL para o servidor remoto. A resposta do servidor remoto também é exibida na tela para fins de depuração.

Lembre-se de ajustar as URLs dos servidores remotos nas variáveis $url_servidor_remoto dos arquivos enviar.php e enviaArquivo.php de acordo com a configuração do seu ambiente. Além disso, adapte os caminhos dos diretórios de destino e temporários conforme suas necessidades específicas.

No exemplo que forneci, o arquivo que vai para o servidor remoto é enviado usando o método cURL como parte dos dados adicionais. Vou adicionar um exemplo de como você pode tratar esse arquivo no servidor remoto enviaArquivo.php.

No enviaArquivo.php no servidor remoto (onde o arquivo será enviado), você pode receber o arquivo enviado via cURL da seguinte maneira:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['arquivo'])) {
    // Diretório onde o arquivo será armazenado no servidor remoto (ajuste conforme necessário)
    $diretorio_destino = '/caminho/para/diretorio_destino/';

    // Verifica se o diretório destino existe, se não, cria-o
    if (!is_dir($diretorio_destino)) {
        mkdir($diretorio_destino, 0755, true);
    }

    // Define o caminho completo do arquivo no servidor remoto (diretório destino + nome do arquivo original)
    $caminho_destino = $diretorio_destino . $_FILES['arquivo']['name'];

    // Move o arquivo enviado para o diretório destino no servidor remoto
    if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $caminho_destino)) {
        // Arquivo recebido e salvo com sucesso no servidor remoto
        echo 'Arquivo recebido e salvo com sucesso no servidor remoto!';
    } else {
        // Erro ao salvar o arquivo no servidor remoto
        echo 'Erro ao salvar o arquivo no servidor remoto!';
    }

    // Outros dados enviados pelo formulário via cURL
    $descricao = $_POST['descricao'];
    // Você pode adicionar mais dados aqui, se necessário
}
?>

Neste exemplo, o arquivo recebido via cURL é movido para um diretório específico no servidor remoto usando a função move_uploaded_file. O nome original do arquivo é mantido, mas você pode alterá-lo conforme necessário.

Lembre-se de ajustar o $diretorio_destino de acordo com o local em que deseja armazenar os arquivos no servidor remoto.

Essa é apenas uma maneira de tratar o arquivo no servidor remoto. Dependendo das suas necessidades, você pode precisar implementar lógica adicional para manipular o arquivo ou armazenar informações sobre ele no banco de dados, por exemplo.

Rolar para cima