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'
    );
    ?>




 
Введення в PHP5
29.05.2007
PHP5 ще офіційно не вийшов, але "робітники" версії вже працездатності (так само як і нестабільні!), Так що ми цілком можемо почати вивчення нових можливостей прийдешнього релізу PHP і попрактикуватися з ними. У цій статті ми поговоримо про три основних нововведення в PHP5
Як надіслати пошту
29.05.2007
Якщо Вам потрібно надіслати повідомлення адміністратору, користувачеві, зробити розсилку, відправити звіт електронною поштою, то простіше за все це зробити за допомогою вбудованої функції mail ()...
Постранічний висновок результату
29.05.2007

 

Rambler's Top100