ru en uk

  авторизація

(044) 362 48 16   (098) 294 41 60


   Ціни

Основи завантаження файлів


Згідно з протоколом HTTP закачувати файли можна двома способами:

  • POST методом
  • PUT методом

Найбільш поширений метод POST, PUT метод у даний час майже не використовується. Щоб броузер передал файл потрібно помістити на сторінку такий HTML код

<form enctype="multipart/form-data" method="post" action="upload_script.php">
<input type = "hidden" name = "
; MAX_FILE_SIZE "value =" 1000 ">
Виберіть файл: <input name="імя_поля" type="file">
<input type="submit" value="Послать файл">
</ form>

</ div>
ОБОВ'ЯЗКОВО потрібно вказувати <form enctype="multipart/form-data" method="post"...> і дуже бажано <input type="hidden" name="MAX_FILE_SIZE" value="XXXX"> причому ДО поля введення фай ла.

Коли ці умови виконані, можна писати скрипт який буде обробляти завантаження файлів.

<? php
function doUpload
olor = "# 007700"> ($ field_name, $ overwrite = false, $ uniquename= False) (
if (!
is_array ($ field_name)) $ field_name nt color = "# 007700"> = Array ($ field_name);
#-------- FILE UPLOAD -----------------
/ / Місце зберігання файлів
$ storage0 "> =" / home / www / public_html / uploads / ";

/ / Маленькі перевірки на майбутні глюки
$ flag = (bool) & nbsp; ini_get ( "safe_mode");
if ($
flag | | (! strstr ( ont> $ _SERVER [ 'SERVER_SOFTWARE'], 'win'))) (
if (getmyuid
>()!= Fileowner ($ storage)) (
die (
"Safe mode uncompatibililty. Check owner for '"# 007700 ">. $ Storage" ' ");
)
)
/ / Дозволені для закачування розширення (типи) файлів
$ allowed < / font> = array (
'jpg',
'gif',
'png',
00 "> 'pdf',
'doc',
'txt',
'rtf'
);

foreach (
$ field_name as $ field_i) (

/ / Максимальний розмір файлу. У будь-якому випадку він & nbsp; не може бути
/ / Більше ніж upload_max_filesize =?? M в php.ini (2Мб)
/ / А також post_max_size =?? M (8Мб)
$ maxsize 61440; / / 60Kб

/ / Зчитує
ім'я закачує файлу
$ filename <font color = "# 007700"> = $ _FILES [$ field_i] [ 'name'];

/ / Вважаючи ваем розмір закачує файлу
$ filename = $ _FILES [$ field_i] [d0000 "> 'size'];

/ / Зчитує розширення файлу
$ fileext = strtolower (substr (strrchr ($ filename, "."), ont color = "# 0000bb"> 1));

/ / Забороняємо закачку недозволених типів, наприклад PHP скриптів!!
if (!"# 0000bb"> in_array ($ fileext, $ allowed)) (
die (
"Невірний тип файлу & quot;);
)

/ / Забороняємо закачку занадто великих файлів
if ($ filesize font>> $ maxsize) (
die (
"Занадто великий файл");
)

& nbs
p; / / зчитує ім'я файлу, який закачан під тимчасову папку
/ / Upload_tmp_dir = у файлі php.ini
$ tmpfnamecolor = "# 007700"> = $ _FILES [$ field_i] [ 'tmp_name'])

/ / Ісправляем ім'я файлу, видаляємо неприпустимі символи, пробіли.
$ filename = ereg_replace ( "[^ a-z0-9._] "," ",
str_replace ( "", "_",
str_replace ( "% 20", "_", strtolower ($ nameor = "# 007700 ">))));

if ($ filename = "") (
die (
"Неприпустиме ім'я &nbsp; файлу. Тільки англійські букви, цифри та'_'!");
)

/ / Повний шлях до закачки файлу
ont> $ filepath = $ storage;
if ($ uniquename) (
000bb "> $ filepath = $ filepath. Time ()." _ ";
)
$ filepath = $ filepath. $ filename;

if (is_u
ploaded_file ($ tmpfname) (

/ / Якщо $ overwrite! = True перевіряємо нету чи вже такого файлу
&
nbsp; if (! $ overwrite) (
if (file_exists ($
filepath ont>)) (
die ( "Файл з ім'ям <b>". $ filename. "&lt; / b> вже існує.
Перейменуйте файл або видаліть його з сервера ");
)
& nbs
p;)

move_uploaded_file ($ tmpfname, $ filepath)
or die ( "Помилка завантаження файлу:". $ filename);
/ / ЕсЧи користувач Апача і FTP різні, наприклад nobody і pupkin,
/ / То щоб мати доступ по FTP (за замовчуванням виставляється 0600)
/ / Поставте & nb sp; 0644 або 0666 якщо хочете також перезаписувати по FTP
@ Chmod ($ filepath 700 ">, 0644);
)
)
)
#------------- END FILE UPLOAD ----------
)
>
/ / Викликати функцію
doUpload ( 'імя_поля');

/ / Закачати декілька файлів СРАзу
doUpload (Array ( 'імя_поля1', 'імя_поля2'));

/ / Якщо потрібно Перезаписісивать існуючий файл
doUpload ( 'імя_поля', true);

/ / Якщо потрібно зберегти існуючий файл
/ / Буде створено нове ім'я, н: pic.jpg -> 989181984_pic.jpg
doUpload ( 'імя_поля'0 ">, false, true);
?>


PHP версії 3 не мав функції move_uploaded_file ()тому до виходу четвертої версії ісполльзовалась функція copy () яка до сих пір знаходиться в документації і користується популярністю. Вкрай небажано використовувати copy () при завантаження файлів, тому що можливі багато глюки. copy () взагалі не буде працювати при включенном open_basedir!! У safe_mode = On щоб використовувати copy () потрібно встановити на тимчасову папку того ж власниками що і виконує скрипт, тоесть аплоад буде неможливо робити, якщо у вас кілька користувачів (як і має бути у випадку віртуальних доменів). Крім того copy ()не виконує перевірку файлу на існування, не повертає

Можливі глюки



  1. file_uploads = Off в php.ini. Закачування файлів заборонено
  2. Нету прав на $ storage = "/ home / www / public_html / uploads /". Змініть chown на користувачапід яким запущений скрипт або поставте на папку chmod 0777
  3. Цільова директорія має іншого власника ніж під яким запущений PHP, коли safe_mode = On. Це повсюдно поширений випадок для кульовий хостингу, коли користувач Апача для прикладу www або nobody,тоді як доступ по FTP, наприклад, для pupkin. Виходу два:

    • Долбить службу підтримки для налаштування однакових юзеров на FTP і Apache (для вашого віртуального домену).
    • Папку для завантаження створити З скрипту під Апачем і поставити на неї 'chmod 0777'. Тоді Ви зможете работа з скриптів обходячи safe_mode заборони й редагувати файли по FTP.

  4. Нету прав на upload_tmp_dir =; (налагодження в php.ini). Поставте chmod 0777 на цю папку.
  5. Файли можуть бути зіпсованим якщо під Апачем запущені деякі модулі, наприклад mod_charset(Також відомий як Russian Apache). Вимкніть його для певних файлів:

    <Files Upload.php> <br>
    CharsetDisable On <br>
    </ Files>

  6. НЕ накачується великі файли. Причин може бути кілька, якщо не виконується хочодне з умов, що файл не розміщено:

    • Розмір файлу більше $ _POST [ 'MAX_FILE_SIZE']
    • Розмір файлу більше upload_max_filesize = 2M (php.ini)
    • Розмір файлу більше post_max_size = 8M (php.ini)
    • Розмір файлу більше LimitRequestBody (httpd.conf)
      Исчерпана дискова квота або на upload_tmp_dir = або на цільову директорію
    • Час виконання скрипта перевищило max_execution_time = (php.ini)
    • Час виконання скрипта перевищило Timeout 30 (httpd.conf)
    • Час виконання скрипта перевищило таймаут для CGI (Консоль IIS)

  7. Користувач сидить за проксі який забороняє передачу
  8. Ви використовували ДРУГОЙ спосіб завантаження, ніж в цій статті, наприклад скорочений синтаксис, при тому що register_globals = Off або стара версія PHP або, ще гірше - искористувався copy () замість move_uploaded_file ().
  9. Неправильно працює $ HTTP_POST_FILES [$ field_name] [ 'type']. Це не глюк PHP, цей параметр передається оглядачем, так що НІКОЛИ не надійтесь на нього.
  10. Проблеми з НЕброузерной закачки файлу (Не URI encoded форма). У більшостістве випадків для цього знадобиться використати $ HTTP_RAW_POST_DATA
  11. Проблеми з закачки файлів нульової довжини. Суть проблеми не в тому, що файли не накачується, а в тому що неможливо визначити закачала чи файл на самом деле. Багато людей перевіряють статус закачки через $ HTTP_POST_FILES[$ field_name] [ 'size'] але як у випадку коли файл не закачала, так і у випадку порожнього файлу, мінлива буде дорівнює 0. Якщо користувач сам надрукують ім'я неіснуючого файлу в полі броузера, він передасться як файл нульової довжини. Перевірити це засобами PHP не можна.
  12. magic_quotes_gpc= On і stripslashes на Win платформі створить проблеми з отриманням імен файлів, так, наприклад $ HTTP_POST_FILES [$ field_name] [ 'size'] все-таки повинен содеражть подвійні бек-слеші.
  13. Неправильні параметри передані в move_uploaded_file (). Там має бути щось на кшталт:

    <? php
    / / Правильний синтаксис
    move_uploaded_file (
    '/ var / php_tmp_upload / userfile.jpg' font>,
    '/ home / pupkin / public_html / userfile.jpg'
    );

    / / Неправильний синтаксис
    move_uploaded_file (
    'userfile.jpg',
    '/ home / pupkin / public_html / userfile.jpg'
    );
    ?>




 
Як надіслати пошту
29.05.2007
Введення в PHP5
29.05.2007
Основи безпеки
29.05.2007