Como fazer upload de imagens e arquivos em CodeIgnição (com exemplo)

⚡ Resumo Inteligente

CodeO Igniter File Upload utiliza a biblioteca Upload integrada para mover imagens e documentos de um formulário HTML para um diretório no servidor. Este exemplo cria um formulário de upload, um controlador que valida o tipo e o tamanho, e uma página de resultados que confirma o upload.

  • 📁 Aula principal: A biblioteca Upload lida com o trabalho de backend de validar um arquivo enviado e gravá-lo no diretório de upload escolhido.
  • 🖼️ Duas partes: Para efetuar um upload, é necessário um formulário HTML no frontend com um campo de entrada do tipo arquivo, além de um controlador no backend que processe o envio.
  • 🔒 Lista de permissões de tipos: A configuração `allowed_types` aceita apenas extensões listadas, como gif, jpg e png, bloqueando arquivos de risco como scripts PHP.
  • 📏 Limites de tamanho: As chaves max_size, max_width e max_height rejeitam arquivos que excedem os limites e retornam uma mensagem de erro clara.
  • 📝 Codificação do formulário: O formulário deve definir o tipo de criptografia como multipart/form-data; caso contrário, o arquivo selecionado nunca chegará ao servidor.
  • 📄 Metadados do resultado: Em caso de sucesso, upload->data() retorna os detalhes do arquivo usados ​​para criar um link para a imagem recém-armazenada.
  • 🤖 Assistência de IA: As ferramentas de IA podem gerar o formulário de upload, as regras de validação do controlador e o tratamento de erros, e depois analisá-los em busca de falhas de segurança.

CodeUpload de Arquivos Igniter

CodeUpload de Arquivos Igniter

O gerenciamento de arquivos é essencial para a maioria das aplicações web. Se você é desenvolvedor...ping Se você estiver usando um sistema de gerenciamento de conteúdo, precisará ser capaz de fazer upload de imagens, documentos do Word, relatórios em PDF e muito mais. Se estiver trabalhando em um site de membros, talvez precise disponibilizar uma opção para que os usuários façam upload de suas fotos de perfil. CodeA classe de upload de arquivos do Igniter facilita muito a realização de tudo isso.

Neste tutorial, veremos como usar a biblioteca de upload de arquivos para carregar arquivos.

Carregando imagens em CodeIgnorar

Upload de arquivo em CodeIgnorar Possui duas partes principais: o frontend e o backend. O frontend é gerenciado pelo formulário HTML que utiliza o tipo de entrada de arquivo. No backend, a biblioteca de upload de arquivos processa a entrada enviada pelo formulário e a grava no diretório de uploads.

Vamos começar com o formulário de entrada.

Crie um novo diretório chamado "files" no diretório "application/views".

Adicione os seguintes arquivos em application/views/files

  • upload_form.php – esta visualização contém o formulário HTML que possui o tipo de arquivo de entrada e envia o arquivo selecionado ao servidor para processamento
  • upload_result.php – esta página exibe os resultados da imagem enviada, incluindo um link clicável para visualizar os resultados.

Adicione o seguinte código a upload_form.php

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter Image Upload</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<h3>Select an image from your computer and upload it to the cloud</h3>
<?php
if (isset($error)){
echo $error;
}
?>
<form method="post" action="<?=base_url(0)?>" enctype="multipart/form-data">
<input type="file" id="profile_image" name="profile_image" size="33" />
<input type="submit" value="Upload Image" />
</form>
</div>
</body>
</html>

AQUI,

  • if (isset($error)){…} verifica se a variável de erro foi definida. Se o resultado for verdadeiro, o erro retornado pela biblioteca de upload é exibido ao usuário.
  • O tipo de arquivo permite ao usuário navegar até seu computador e selecionar um arquivo para upload.

Adicione o seguinte código ao arquivo upload_result.php.

<!DOCTYPE html>
<html>
<head>
<title>Image Upload Results</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<h3>Congratulations, the image has successfully been uploaded</h3>
<p>Click here to view the image you just uploaded
<?=anchor('images/'.$image_metadata['file_name'], 'View My Image!')?>
</p>
 
<p>
<?php echo anchor('upload-image', 'Go back to Image Upload'); ?>
</p>
</div>
</body>
</html>

AQUI,

  • Utiliza o auxiliar de âncora para criar um link para o arquivo recém-carregado no diretório de imagens. O nome é obtido dos metadados da imagem que são passados ​​para a visualização quando o arquivo é carregado com sucesso.

Vamos agora criar o controlador que responderá ao nosso envio de imagem.

Adicione um novo arquivo ImageUploadController.php em application/controllers

Adicione o seguinte código a ImageUploadController.php

<?php
 
defined('BASEPATH') OR exit('No direct script access allowed');
 
class ImageUploadController extends CI_Controller {
 
public function __construct() {
parent::__construct();
$this->load->helper('url', 'form');
}
 
public function index() {
$this->load->view('files/upload_form');
}
 
public function store() {
$config['upload_path'] = './images/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 2000;
$config['max_width'] = 1500;
$config['max_height'] = 1500;
 
$this->load->library('upload', $config);
 
if (!$this->upload->do_upload('profile_image')) {
$error = array('error' => $this->upload->display_errors());
 
$this->load->view('files/upload_form', $error);
} else {
$data = array('image_metadata' => $this->upload->data());
 
$this->load->view('files/upload_result', $data);
}
}
 
}

AQUI,

  • class ImageUploadController estende CI_Controller {…} define nossa classe de controlador e estende o controlador base CI_Controller
  • função pública __construct() {…} inicializa o método construtor pai e carrega o URL e os auxiliares de formulário
  • public function index() {…} define o método de índice usado para exibir o formulário de upload de imagem
  • public function store() {…} define o método que fará upload da imagem e a armazenará no servidor de aplicativos web.
    • $config['upload_path'] = './images/'; define o diretório onde as imagens devem ser carregadas
    • `$config['allowed_types'] = 'gif|jpg|png';` define as extensões de arquivo aceitáveis. Isso é importante por motivos de segurança. Os tipos permitidos garantem que apenas imagens sejam enviadas e que outros tipos de arquivo, como PHP, não sejam enviados, pois podem comprometer o servidor.
    • `$config['max_size'] = 2000;` define o tamanho máximo do arquivo em kilobytes. No nosso exemplo, o arquivo máximo que pode ser carregado é de 2,000 KB, próximo a 2 MB. Se o usuário tentar carregar um arquivo maior que 2,000 KB, a imagem não será carregada e a biblioteca retornará uma mensagem de erro.
    • `$config['max_width'] = 1500;` define a largura máxima da imagem, que em nosso caso é de 1,500 px. Qualquer largura maior que essa resulta em um erro.
    • $config['max_height'] = 1500; define a altura máxima aceitável.
    • $this->load->library('upload', $config); carrega a biblioteca de upload e a inicializa com o array $config que definimos acima.
    • if (!$this->upload->do_upload('profile_image')) {…} tenta fazer o upload da imagem enviada, que em nosso caso se chama profile_image.
    • $erro = array('erro' => $this->upload->display_errors()); define a mensagem de erro se o upload falhar
    • $this->load->view('arquivos/upload_form', $error); carrega o formulário de upload de arquivo e exibe a mensagem de erro retornada da biblioteca de upload
    • $dados = array('image_metadata' => $this->upload->dados()); define os metadados da imagem se o upload tiver sido bem-sucedido
    • $this->load->view('arquivos/upload_result', $dados); carrega a visualização carregada com sucesso e transmite os metadados do arquivo carregado.

Isso conclui a configuração do controlador. Agora, vamos criar o diretório onde as imagens serão armazenadas. Crie um novo diretório chamado "images" no diretório raiz da sua aplicação.

Por fim, adicionaremos duas rotas ao nosso arquivo routes.php que exibirão o formulário e os resultados.

Abra o arquivo application/config/routes.php e adicione as seguintes rotas.

$route['upload-image'] = 'imageuploadcontroller';
$route['store-image'] = 'imageuploadcontroller/store';

AQUI,

  • $route['upload-image'] = 'imageuploadcontroller'; define o URL upload-image que chama o método index do ImageUploadController
  • $route['store-image'] = 'imageuploadcontroller/store'; define o URL O comando `store-image` aceita o arquivo selecionado pelo usuário e o envia para o servidor.

Como corrigir problemas comuns CodeErros de upload de arquivos do Igniter

Na maioria dos casos, as falhas de upload retornam uma mensagem clara da biblioteca de upload. A lista abaixo relaciona os erros comuns às suas respectivas soluções.

  • O tipo de arquivo que você está tentando enviar não é permitido: Adicione a extensão que falta à configuração allowed_types, por exemplo, 'gif|jpg|png|pdf'.
  • O arquivo que você está tentando enviar é maior do que o tamanho permitido: Aumente o tamanho máximo (max_size) e confirme se os valores de upload_max_filesize e post_max_size no arquivo php.ini são suficientemente grandes.
  • O caminho de upload parece não ser válido: Crie o diretório upload_path e certifique-se de que o servidor web tenha permissão de escrita nele.
  • Você não selecionou nenhum arquivo para enviar: Verifique se o nome do campo de entrada corresponde ao argumento do_upload() e se o formulário usa o tipo de criptografia multipart/form-data.

Testando o aplicativo

Vamos iniciar o servidor PHP integrado.

Abra o terminal ou a linha de comando e navegue até a raiz do seu aplicativo. No meu caso, a raiz está localizada na unidade C:\Sites\ci-app.

cd C:\Sites\ci-app

Inicie o servidor usando o seguinte comando

php -S localhost:3000

Carregue o seguinte URL No seu navegador web: http://localhost:3000/upload-image

Você poderá ver os seguintes resultados.

Carregando imagens em CodeIgnorar

Clique em escolher arquivo

Você deverá conseguir ver uma janela de diálogo semelhante à seguinte

Carregando imagens em CodeIgnorar

Selecione a imagem desejada e clique em Abrir.

Carregando imagens em CodeIgnorar

O nome do arquivo selecionado aparecerá no formulário de upload, como mostrado na imagem acima. Clique no botão "Enviar imagem".

Você obterá os seguintes resultados, supondo que tudo corra bem.

Carregando imagens em CodeIgnorar

Clique no link "Ver minha imagem!"

Você deverá conseguir visualizar a imagem que carregou. Os resultados serão semelhantes aos seguintes.

Carregando imagens em CodeIgnorar

Observe que o nome da imagem carregada é exibido no URLObtivemos o nome da imagem a partir dos metadados da imagem carregada.

Observação: O processo de envio de arquivos permanece o mesmo para outros tipos de arquivos.

Perguntas Frequentes

O CodeA biblioteca Igniter 3 Upload processa um arquivo por chamada do_upload(), então você percorre o arquivo $_FILES em um loop e chama a função para cada item. CodeO Igniter 4 suporta o envio de múltiplos arquivos diretamente através do método getFileMultiple().

Não. CodeO Igniter 4 substitui a biblioteca Upload pela API Request File. Você chama `$this->request->getFile('field')`, valida o arquivo e usa `move()` para armazená-lo, em vez de carregar uma biblioteca de upload separada.

Defina `$config['encrypt_name'] = TRUE` para atribuir um nome aleatório a cada arquivo ou defina `$config['file_name']` com um valor de sua escolha. Isso impede a sobrescrita de arquivos existentes que compartilham o mesmo nome original.

Sim. A IA pode gerar a lista de permissões de tipos (allowed_types), limites de tamanho e tratamento de erros, além de sugerir verificações adicionais, como a verificação do tipo MIME real. Sempre teste as regras geradas com arquivos reais antes da implementação.

Sim. Cole a mensagem de erro e o seu controlador, e a IA poderá identificar problemas como um formulário multipart ausente, um upload_path não gravável ou uma extensão ausente em allowed_types, e então sugerir a correção.

Resuma esta postagem com: