Jak przesłać obraz i plik do CodeIgniter (z przykładem)
Przesyłanie pliku CodeIgniter
Zarządzanie plikami jest niezbędne w większości aplikacji internetowych. Jeśli opracowujesz system zarządzania treścią, będziesz musiał mieć możliwość przesyłania obrazów, dokumentów Word, raportów w formacie PDF itp. Jeśli pracujesz na stronie członkowskiej, być może będziesz musiał uwzględnić możliwość przesyłania swoich profili obrazy. Klasa przesyłania plików CodeIgnitera ułatwia nam wykonanie wszystkich powyższych czynności.
W tym samouczku przyjrzymy się, jak używać biblioteki przesyłania plików do ładowania plików.
Przesyłanie obrazów w CodeIgniter
Przesyłanie plików w CodeIgniter ma dwie główne części. Frontend i backend. Frontend jest obsługiwany przez formularz HTML, który wykorzystuje plik typu wejściowego formularza. Na zapleczu biblioteka przesyłania plików przetwarza przesłane dane wejściowe z formularza i zapisuje je w katalogu przesyłania.
Zacznijmy od formularza wejściowego.
Utwórz nowy katalog o nazwie files w katalogu application/views
Dodaj następujące pliki w application/views/files
- upload_form.php – ten widok zawiera formularz HTML, który ma typ wejściowy pliku i przesyła wybrany plik do serwera w celu przetworzenia
- upload_result.php – ten widok wyświetla wyniki przesłanego obrazu wraz z linkiem, który możemy kliknąć, aby wyświetlić wyniki.
Dodaj następujący kod do 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('store-image')?>" 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>
TUTAJ,
- if (isset($error)){…} sprawdza, czy zmienna błędu została ustawiona. Jeśli wynik jest prawdziwy, błąd zwrócony przez bibliotekę upload jest wyświetlany użytkownikowi.
- plik typu umożliwia użytkownikowi przejście do komputera i wybranie pliku do przesłania.
Dodaj następujący kod do 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>
TUTAJ,
- używa pomocy kotwicy do utworzenia łącza do nowo przesłanego pliku w katalogu obrazów. Nazwa jest pobierana z metadanych obrazu przekazywanych do widoku po pomyślnym przesłaniu pliku.
Stwórzmy teraz kontroler, który będzie reagował na przesyłanie przez nas obrazu
Dodaj nowy plik ImageUploadController.php w aplikacji/kontrolery
Dodaj następujący kod do 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);
}
}
}
TUTAJ,
- class ImageUploadController rozszerza CI_Controller {…} definiuje naszą klasę kontrolera i rozszerza kontroler bazowy CI_Controller
- funkcja publiczna __construct() {…} inicjuje metodę konstruktora nadrzędnego i ładuje pomoce adresu URL i formularza
- funkcja publiczna indeks() {…} definiuje metodę indeksowania używaną do wyświetlenia formularza przesyłania obrazu
- funkcja publiczna store() {…} definiuje metodę, która prześle obraz i zapisze go na serwerze aplikacji internetowej.
- $config['upload_path'] = './images/'; ustawia katalog, do którego mają zostać przesłane obrazy
- $config['allowed_types'] = 'gif|jpg|png'; określa dopuszczalne rozszerzenia plików. Jest to ważne ze względów bezpieczeństwa. Dozwolone typy zapewniają, że przesyłane są tylko obrazy, a inne typy plików, takie jak php, nie mogą być przesyłane, ponieważ mogą potencjalnie zagrozić serwerowi.
- $config['max_size'] = 2000; ustaw maksymalny rozmiar pliku w kilobajtach. W naszym przykładzie maksymalny plik, który można przesłać, to 2,000 KB, czyli około 2 MB. Jeśli użytkownik spróbuje przesłać plik większy niż 2,000 KB, przesłanie obrazu nie powiedzie się, a biblioteka zwróci komunikat o błędzie.
- $config['max_width'] = 1500; ustawia maksymalną szerokość obrazu, która w naszym przypadku wynosi 1,500 px. Każda szerokość większa niż ta powoduje błąd
- $config['max_height'] = 1500; określa maksymalną dopuszczalną wysokość.
- $this->load->library('upload', $config); ładuje bibliotekę przesyłania i inicjuje ją tablicą $config, którą zdefiniowaliśmy powyżej.
- if (!$this->upload->do_upload('profile_image')) {…} próbuje przesłać przesłany obraz, który w naszym przypadku nosi nazwę obraz_profilu
- $error = array('error' => $this->upload->display_errors()); ustawia komunikat o błędzie, jeśli przesyłanie nie powiedzie się
- $this->load->view('files/upload_form', $error); ładuje formularz przesyłania pliku i wyświetla komunikat o błędzie zwrócony przez bibliotekę przesyłania
- $data = array('image_metadata' => $this->upload->data()); ustawia metadane obrazu, jeśli przesyłanie zakończyło się pomyślnie
- $this->load->view('files/upload_result', $data); ładuje przesłany widok i przekazuje metadane przesłanego pliku.
To tyle, jeśli chodzi o kontroler. Stwórzmy teraz katalog, do którego będą przesyłane nasze obrazy. Utwórz nowy katalog „images” w katalogu głównym aplikacji
Na koniec dodamy dwie trasy do naszego pliku Routes.php, który wyświetli formularz i wyświetli wyniki
Open application/config/routes.php Add the following routes $route['upload-image'] = 'imageuploadcontroller'; $route['store-image'] = 'imageuploadcontroller/store';
TUTAJ,
- $route['upload-image'] = 'imageuploadcontroller'; definiuje adres URL przesyłanego obrazu, który wywołuje metodę indeksu ImageUploadController
- $route['store-image'] = 'imageuploadcontroller/store'; definiuje obraz sklepu URL, który akceptuje wybrany plik użytkownika i przesyła go na serwer.
Testowanie aplikacji
Uruchommy wbudowany serwer PHP
Otwórz terminal/wiersz poleceń i przejdź do katalogu głównego aplikacji. W moim przypadku katalog główny znajduje się na dysku C:\Sites\ci-app
cd C:\Sites\ci-app
uruchom serwer za pomocą następującego polecenia
php -S localhost:3000
Wczytaj następujący adres URL do swojej przeglądarki internetowej: http://localhost:3000/upload-image
będziesz mógł zobaczyć następujące wyniki
Kliknij wybierz plik
Powinno zostać wyświetlone okno dialogowe podobne do poniższego
Wybierz żądany obraz, a następnie kliknij Otwórz
Wybrana nazwa pliku pojawi się w formularzu przesyłania, jak pokazano na powyższym obrazku. Kliknij przycisk przesyłania obrazu
Zakładając, że wszystko pójdzie dobrze, otrzymasz następujące wyniki
Kliknij opcję Wyświetl mój obraz! Połączyć
Powinieneś móc zobaczyć obraz, który przesłałeś. Wyniki będą podobne do następujących
Zauważ, że nazwa przesłanego obrazu jest wyświetlana w adresie URL. Nazwę obrazu uzyskaliśmy z metadanych przesłanego obrazu
Uwaga: proces przesyłania plików pozostaje taki sam w przypadku innych typów plików





