(044) 362 48 16 (098) 294 41 60
|
|
|
Основи завантаження файлів Згідно з протоколом HTTP закачувати файли можна двома способами:
Найбільш поширений метод 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 doUploadolor = "# 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 ( "Неприпустиме ім'я файлу. Тільки англійські букви, цифри та'_'!"); )
/ / Повний шлях до закачки файлу ont> $ filepath = $ storage; if ($ uniquename) ( 000bb "> $ filepath = $ filepath. Time ()." _ "; ) $ filepath = $ filepath. $ filename;
if (is_uploaded_file ($ tmpfname) (
/ / Якщо $ overwrite! = True перевіряємо нету чи вже такого файлу if (! $ overwrite) ( if (file_exists ($ filepath ont>)) ( die ( "Файл з ім'ям <b>". $ filename. "< / b> вже існує. Перейменуйте файл або видаліть його з сервера "); ) & nbsp;)
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 ()не виконує перевірку файлу на існування, не повертає Можливі глюки
- file_uploads = Off в php.ini. Закачування файлів заборонено
- Нету прав на $ storage = "/ home / www / public_html / uploads /". Змініть chown на користувачапід яким запущений скрипт або поставте на папку chmod 0777
- Цільова директорія має іншого власника ніж під яким запущений PHP, коли safe_mode = On. Це повсюдно поширений випадок для кульовий хостингу, коли користувач Апача для прикладу www або nobody,тоді як доступ по FTP, наприклад, для pupkin. Виходу два:
- Долбить службу підтримки для налаштування однакових юзеров на FTP і Apache (для вашого віртуального домену).
- Папку для завантаження створити З скрипту під Апачем і поставити на неї 'chmod 0777'. Тоді Ви зможете работа з скриптів обходячи safe_mode заборони й редагувати файли по FTP.
- Нету прав на upload_tmp_dir =; (налагодження в php.ini). Поставте chmod 0777 на цю папку.
- Файли можуть бути зіпсованим якщо під Апачем запущені деякі модулі, наприклад mod_charset(Також відомий як Russian Apache). Вимкніть його для певних файлів:
<Files Upload.php> <br> CharsetDisable On <br> </ Files>
- НЕ накачується великі файли. Причин може бути кілька, якщо не виконується хочодне з умов, що файл не розміщено:
- Розмір файлу більше $ _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)
- Користувач сидить за проксі який забороняє передачу
|
|