Biblioteka PHP | Wysyłanie pliku na serwer
jQuery(document).ready(function($) {
$('a[rel*=facebox]').facebox()
})
Jesteś tutaj: Strona Główna > PHP w Akcji > Wysyłanie pliku na serwer
Wysyłanie pliku na serwer
Kategorie:
Podstawy PHPPHP w AkcjiKurs Code IgniterpunFramework
Pomoc
Forum
Zaloguj lub Zarejestruj
Kanał RSS KategoriiPrzeglądaj wiadomości z kategorii
Przesyłanie plików za pomocą PHP jest łatwe i odbywa się zazwyczaj za pomocą formularza (zabawy ze strumieniami sobie odpuścimy). Stwórz skrypt o następującym kodzie:
<?php
echo '<pre>';
print_r($_POST);
echo '<HR>';
print_r($_FILES);
echo '</pre><HR>';
echo '<form enctype="multipart/form-data" method="post" action="a.php"><input type="file" size="32" name="plik_upload" value=""><input type="submit" name="Wyślij"></form>';
Ja nazwałem go "a.php", nazwa dowolna, pamiętaj tylko o zmianie parametru action. Jest to prosty skrypt roboczy zawierający odpowiedni formularz oraz wyświetlający zawartość tablic _POST i _FILES. Zaczynamy od formularza. By formularz mógł wysłać plik konieczny jest dodatek enctype="multipart/form-data" do taga FORM. Kolejnym elementem jest pole typu file (o dowolnej nazwie i tytule). Formularz musi mieć też oczywiście przycisk wysyłający.
Po otworzeniu skryptu w przeglądarce zobaczymy coś takiego:
Zaznacz jakiś plik z dysku i wyślij formularz. Zobaczysz wtedy coś takiego:
Interesuje nas tablica _FILES. Zawiera ona dane o wysłanym pliku: name - nazwa, type - typ MIME (bardzo ważne), tmp_name - nazwa pliku tymczasowego, size - rozmiar w bajtach. Nasz skrypt nie umie jeszcze ładować pliku ale zaraz się tego nauczy. Musimy po prostu przenieść/skopiować plik tymczasowy do bierzącego katalogu:
<?php
// Powyżej nasz formularz
$f = $_FILES['plik_upload'];
IF(isset($f['name']))
{
copy($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
//lub
rename($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
//lub
move_uploaded_file($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
}
Wszystkie trzy sposoby (copy, rename, move_uploaded_file) powinny działać (na ładowanie plików ma wpły wiele ustawień PHP jak safe mod czy bezpośrednio zezwolenie na ładowanie plików). Omówienie kodu: zaczynamy od $f = $_FILES['plik_upload']; - po prostu podtablicę przypisujemy do zmiennej $f ($_FILES['NAZWA_POLA_FILE_Z_FORMULARZA']) by było ładniej potem jeżeli to co przypisaliśmy jest tablicą (tj. coś się wysłało) to kopiujemy plik gdzie trzeba. Dziwna ścieżka: /opt/lampp/htdocs/html/ to ścieżka katalogu do miejsca na serwerze, na naszym koncie, w którym pojawić się ma nasz plik (zobacz phpinfo). Możemy to trochę zautomatyzować:
<?php
$f = $_FILES['plik_upload'];
IF(isset($f['name']))
{
$patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
copy($f['tmp_name'], $patch.$f['name']);
//lub
rename($f['tmp_name'], $patch.$f['name']);
//lub
move_uploaded_file($f['tmp_name'], $patch.$f['name']);
}
Zmienna $_SERVER['SCRIPT_FILENAME'] przechowuje całą ścieżkę katalogów od głównego do katalogu ze skryptem wraz z jego nazwą np. w tym przykładzie: /opt/lampp/htdocs/html/a.php. By mieć ścieżkę usuwamy nazwę pliku ze zmiennej i mamy ścieżkę (którą możemy dalej modyfikować itd.)
Bezpieczeństwo skryptu
Powyższy skrypt załaduje dowolny plik i jeżeli dostęp będą miały do niego niepowołane osoby to mogą np. załadować własny skrypt PHP. By ograniczyć ładowanie tylko określonych plików np. grafik wykorzystamy wartość klucza type:
<?php
$f = $_FILES['plik_upload'];
IF($f['type'] == 'image/png' or $f['type'] == 'image/jpeg' or $f['type'] == 'image/gif')
{
$patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
copy($f['tmp_name'], $patch.$f['name']);
}
else
{
echo 'Niedozwolony plik';
}
Oprócz tego warto zabezpieczyć się przed plikami o podmienionych rozszerzeniach, np:
<?php
$f = $_FILES['plik_upload'];
IF($f['type'] == 'image/png' or $f['type'] == 'image/jpeg' or $f['type'] == 'image/gif')
{
$x = getimagesize($f['tmp_name']);
IF(!is_array($x) or $x[0] < 2)
{
die('Zły plik graficzny');
}
$patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
copy($f['tmp_name'], $patch.$f['name']);
}
else
{
echo 'Niedozwolony plik';
}
Wykorzystaliśmy funkcję PHP GetImageSize pobierającą dane o pliku graficznym. Funkcja ta zwraca tablicę z wymiarami i innymi danymi więc jeżeli nie mamy tablicy (plik nie jest grafiką) lub długość jest mniejsza od 2 pikseli to znaczy że mamy podróbkę (pliki nie-grafika o zmienionym rozszerzeniu mają rozmiar 0 na 0)
Nie zapomnij też o zabezpieczaniu takich skryptów hasłem (chyba że są to np. ładowacze awatarów itd.)
Wysyłanie wielu plików naraz
Zobacz tablicę _FILES dla skryptu:
<?php
echo '<pre>';
print_r($_POST);
echo '<HR>';
print_r($_FILES);
echo '</pre><HR>';
echo '<form enctype="multipart/form-data" method="post" action="a.php">
<input type="file" size="32" name="plik_upload[]" value="">
<input type="file" size="32" name="plik_upload[]" value="">
<input type="file" size="32" name="plik_upload[]" value="">
<input type="submit" name="Wyślij"></form>';
nazwa pola file wszędzie jest taka sama, tyle że jest tablicą - plik_upload[] (te nawiasy na końcu).
Notka: pliki nie muszą być kopiowane z tmp/ na nasze konto, możemy je np. też wysłać emailem, wystarczy klasa wysyłająca maile z załącznikiem....c { color: #408080; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
.cp { color: #BC7A00 } /* Comment.Preproc */
.c1 { color: #408080; font-style: italic } /* Comment.Single */
.cs { color: #408080; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #FF0000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #00A000 } /* Generic.Inserted */
.go { color: #808080 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0040D0 } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #7D9029 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #999999; font-weight: bold } /* Name.Entity */
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #A0A000 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #BB6688 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.il { color: #666666 } /* Literal.Number.Integer.Long */
Dodane: 14.07.2008 przez riklaunim
Przeglądaj newsy
RSS - ostatnie wiadomości i artykuły
RSS - Co nowego?
Biblioteka Riklaunima. Hosting NRC-FOSS na AU-KBC. Serwis oparty o Django/Python.
_uacct = "UA-166391-3";
urchinTracker();
Wyszukiwarka
Podobne podstrony:
Dlaczego nie widać ilości pobrań pliku na chomikuj infoWykłady od 1 do 29 Profesor Wolter Veith na serwerze Filesonic100 sposobow na serwery Windows0serJava Programowanie, biblioteki open source i pomysly na nowe projektyJak założyć pocztę na własnym serwerzePHP i MySQL Witryna WWW oparta na bazie danych Wydanie IVJak sporzadzic bibliografie na maturePrzejmowanie na własność pliku lub folderu w systemie Windows XP100 sposobow na PHP0phpMetin2 Captcha na chińskich serwerachpraca dyplomowa serwer internetowy na linuxiewięcej podobnych podstron