Wysyłanie pliku na serwer
14 July 2008
Comments
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>';
Po otworzeniu skryptu w przeglądarce zobaczymy coś takiego:


<?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']);
}
<?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']);
}
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';
}
<?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';
}
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>';
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...
RkBlog
Comment article