120 Shares 5599 views

PHP: upload plików na serwer

Pobieranie plików za pośrednictwem PHP – bardzo ciekawy przypadek, do którego należy podchodzić bardzo ostrożnie. W Internecie można znaleźć wiele przykładów realizacji przesyłania plików, ale nie wszystkie z nich są dobre i spełniają normy bezpieczeństwa.

Takie rzeczy trzeba doprowadzić do końca, nawet jeśli trwa długo. Jeśli zostawisz lukę w kodzie, a następnie cały serwer może być zagrożona.

bezpieczeństwo

Z PHP plik przesłać do serwera odbywa się dość łatwo. Kod jest bardzo krótka i prosta. Zaledwie kilka linii. Jednak ta metoda jest niebezpieczna. Dużo więcej czasu i linii kodu z dala bezpieczeństwa.

Niebezpieczeństwo polega na tym, że jeśli nie robić inspekcje, każda osoba atakująca może przesłać swoje skrypty na serwerze. W tym przypadku będzie to mieć pełny dostęp. On może robić, co chce:

  • usunąć bazę danych;
  • Usuwanie plików witryn;
  • modyfikowanie plików witryn;
  • dodaj swoją reklamę na swojej stronie;
  • pobierz wirusy;
  • przekierowanie wszystkich użytkowników na swoich stronach;
  • i wiele innych rzeczy, które przychodzą na myśl atakującego.

Należy zawsze sprawdzić, że próby pobrania pliku dla użytkownika. Na przykład, jeśli przesłać tylko obrazów, konieczne jest, aby sprawdzić, czy plik jest obrazem dokładnie. W przeciwnym razie nic ściągać.

Dokładnie jak wdrożyć weryfikację, zostanie on pokazany z bezpośrednim skryptu sprawdzającą, aby przesłać pliki.

Tworzenie formularza PHP

forma przesyłania plików jest bardzo prosta. Brakujący przycisk Przeglądaj i przesłać przyciski.

Opisuje sposób tworzenia formy nie będzie, bo to łatwe. Dalsze instrukcje zakładają, że masz już podstawowe pojęcia HTML (w przeciwnym razie nie byłoby szukasz informacji o pobieraniu na PHP).

Należy jednak pamiętać, że dane w formularzu trzeba dodać atrybut enctype.

Inaczej, dane dotyczące obsługi plików nie będą transmitowane.

Jak powinien działać?

Po kliknięciu na przycisk przeglądania powinno pojawić się okno, w którym poproszono o wybranie pliku.

Po, że będzie to wymagane, aby otrzymać ścieżkę, gdzie plik się znajduje.

Jeśli ścieżka nie pojawia, wykonaj ponownie operację.

Po kliknięciu obsługi pobierz plik może udzielić żadnych informacji.

Na przykład, można napisać wiersz, który stwierdza, że plik jest „tak i tak” nazwa została pomyślnie przesłany do „takiego a takiego” folderu. Oczywiście, nazwa pliku będzie mieć zawsze inna.

Zazwyczaj ta informacja jest wykorzystywana do debugowania kodu. Tak więc możliwe jest, aby upewnić się, że dane są przesyłane i pisze nastąpić w odpowiednim katalogu. Oznacza to, że nawet nazwa pliku nie jest wskazany. Od tej dodatkowej informacji, że użytkownik nie musi.

Sensowne jest wyjście nazwę tylko wtedy, gdy użytkownik pobiera wielu plików. Tak jest w przypadku, należy rozważyć trochę dalej. Nie dajmy się przed siebie.

regulacja

W PHP przesyłania plików na serwer wymaga pewnych ustawień, które powinny być wykonywane w pliku php.ini. Plik ten zawiera wiele ustawień. Oni wszyscy nie potrzebujemy. Jesteśmy zainteresowani w trzech liniach: file_uploads, upload_tmp_dir i upload_max_filesize.

Należy pamiętać, że te ustawienia wpłyną na wszystkie strony na serwerze, a nie tylko w jedno. Dlatego, aby ustawić maksymalną wielkość w oparciu o fakt, że trzeba będzie załadować użytkowników. Nie zaleca się zbyt duże.

Po zmianie wartości w tych parametrach, trzeba zrestartować serwer. W przeciwnym razie ustawienia nie zostaną zastosowane, jak czytają w czasie obciążenia serwera.

Można to zrobić w konsoli przez podłączenie poprzez SSH do serwera. Wystarczy wpisać httpd restart usług polecenia, a następnie ustawienia zostaną zastosowane.

Inna metoda – restart poprzez ISP-rozliczeniowego lub poprzez panel operatora centrali.

plik Array

W PHP przesyłanie plików odbywa się poprzez tablicy $ _FILES. Zawiera on wszystkie informacje na temat plików, które możemy pobrać.

Aby zobaczyć, jakie informacje są zawarte w tablicy, wystarczy napisać do obsługi plików następujący.

Wybierz dowolny plik i kliknij przycisk „Prześlij”. Na stronie programu obsługi wyświetli informacje, które są przechowywane w $ _FILES. Zmienna jest napisany w całości dużymi literami. PHP – język wrażliwy.

Jak widać, w tej tablicy ma wiele dziedzin. Wszystkie z nich są dla nas ważne. Pierwsze pole zawiera nazwę pliku w postaci, w jakiej jest on używany na komputerze.

Kolumna typu określony typ pliku. Tmp_name pole odpowiada nazwie pliku tymczasowego. Po zakończeniu skryptu zostaną usunięte.

Pole błędu zawiera kod błędu. To było trochę dalej. Rozmiar – rozmiar w bajtach.

błędy

Przeprowadzone przez upload plików PHP zawsze towarzyszy kod błędu. Komunikat o błędzie wpisane do „błędu”. Błąd ekranu wynosi zero.

Rozważmy wartość wszystkich błędów:

To zostało powiedziane wyżej o parametr, który może być określony w zwykły HTML.

Oto przykładowy formularz do pobrania pliku, co wskazuje na limit ilości przesłanego pliku.

skryptu wysyłania pliku: PHP

Ponieważ wszystkie przeprowadzone w praktyce? W PHP Prześlij plik występuje polecenie kopiowania. Jeśli jesteś zainteresowany w kwestii sposobu pobierania pliku, odpowiedź jest prosta kopiowaniem, która wykorzystuje dwa parametry – plik źródłowy i docelowy plik.

Jednak, jak wspomniano powyżej, nie może być ograniczona ze względów bezpieczeństwa. Na przykład, sprawdź, jaki rodzaj pliku wysyłamy, można użyć typu pola w tablicy $ _FILES. Najpierw czynienia z inspekcji, a następnie przejść do pełnego scenariusza

Powiedzmy, że chcesz, aby użytkownicy mogli załadować zdjęcie o rozdzielczości jedynie GIF, JPEG lub PNG. Wskazywać może tak być.

if ($ _ FILES [ 'file_upload'] [ 'typu']! = "image / gif") {
echo "Niestety, mamy tylko obsługuje pobierania Gif-Files";
exit;
}

Jeśli chcesz wysyłać wszystkie 3 rodzaje, po prostu dodać dodatkowy warunek do innego rodzaju obrazu.

Kopiowanie odbywa się tak: kopia obrazu (1, 2) obrazu.

W naszym przypadku, gdy praca jest pobieranie z komputera do serwera, możesz to zrobić

copy ($ _ FILES [ 'file_upload'] [ "tmp_name"], "1.jpg")

Oznacza to, że plik zostanie skopiowany z nazwą 1.jpg. To nie jest do końca prawidłowe. W tym przypadku jest to tylko przykład. Nazwa pliku jest zawsze konieczne, aby określić inny, i określić rozszerzenie, w zależności od pliku.

Określić rozszerzenie mogą być różne sposoby. To wszystko zależy od dewelopera erudycji. Jednym z najszybszych sposobów (różnica dziesiątych sekundy) ustalenia rozszerzenie – jest to następny kod.

$ PATH_INFO = pathinfo ($ _ Dodatki [ 'Photo1'] [ "Nazwa"]);

$ Ext = $ PATH_INFO [ 'rozszerzenie'];

Zmienna $ EXT będziemy przechowywać żądane rozszerzenie. Nazwa pliku może być ustawiony na losowej przy użyciu MD5. Jeśli planują pobrać wiele plików, to lepiej, aby wysłać je do różnych folderów. Tak będzie wygodniej. W szczególności, jeśli chcesz oczyścić.

pobrać kod będzie wyglądał następująco.

/// ze zdjęciem

if ($ _FILES [ 'Photo1'] [ 'tmp_name'] == null)

{

echo ( „

Unknown plików.

Powrót …

„);

exit;

}

///. Załóżmy, że dla każdego projektu na serwerze wolno ładować duże pliki (wideo), ale są tylko zdjęcia, a użytkownicy muszą ograniczać

jeśli (($ _FILES [ "Photo1"] [ "wielkość"]> 1024 * 1024 * 2)

{

?>

maksymalny dopuszczalny rozmiar 2 MB

Powrót …

<?

exit;

}

// tworzenie folderów

// utwórz folder bieżącego miesiąca

if (! file_exists ( "img /". data ( "M")))

{

Mkdir ( "img /" datę ( "M").);

}

// utwórz folder na bieżący dzień

if (! file_exists ( "img /" data ( "M"). "/". data ( "d"))).

{

mkdir ( "img /" data ( "M") "/" data ( "d") …);

}

/// rozszerzenie pliku

$ PATH_INFO = pathinfo ($ _ Dodatki [ 'Photo1'] [ "Nazwa"]);

$ Ext = $ PATH_INFO [ 'rozszerzenie'];

/// wygenerowania pliku

$ Id = md5 (data ( "RMD"));

jeśli (kopia ($ _ Dodatki [ 'Photo1'] [ "tmp_name"] "img /" datę ( "M"). "/". Termin ( "D"). "/." $ id. $ EXT). )

{

echo ( "Plik został przesłany");

}

/// jakiekolwiek dalsze działania (wpis w bazie danych, i tak dalej. N.)

}

wiele plików

Przesyłanie wielu plików (PHP) następuje za pomocą dodatkowych pól w formularzu.

Metoda ta nie jest bardzo dobra, ponieważ ogranicza liczbę plików do pobrania. Co więcej, uważa się, zła forma w programowaniu. Starają się zrobić wszystko, dynamiczny.

Idealnym rozwiązaniem – jest to wybór wielu plików na raz przez naciśnięcie jednego przycisku.

Aby to zrobić, należy utworzyć kształt podobny do tego kodu.

Formularz

Należy zauważyć, że wielokrotne dodanie słowa i nazwę podano w tablicy []. W tym przypadku $ _FILES Tablica będzie nieco inna. Dostaniesz tablicę tablicy.

Aby przetestować można ponownie użyć var_dump ($ _ FILES);

Wszystkie pliki zostaną umieszczone w tablicy jak poniżej:

  1. $ _FILES [ "plik1"] [ "nazwa"] [0]
  2. $ _FILES [ "plik1"] [ "nazwa"] [1]
  3. I tak dalej.

W nawiasach jest napisany numer pliku w tablicy. Licząc od zera. Traktujemy je w taki sam sposób, po prostu zapytać cyklu i przez kontaktowanie opisanego powyżej kod na końcu indeksu Dodaję [$ i].

$ I = 0;

while ($ _FILES [ "plik1"] [ "nazwa"] [$ i] '')

{

/// wklej powyższy kod

}

Tak więc trzeba będzie się dziać przez PHP upload plików na serwer w jednym cyklu bez zbędnego powtarzania kodu, jak to zwykle bywa w przypadku korzystania z wersji z wielu statycznych plików (ostatnie zdjęcie).