Качване на файлове, както и всичко свързано с него

Кратка екскурзия за качване

Дори и да имате на разположение само на един компютър, който комбинира двата сървъра и работната станция не трябва да забравяме, че PHP използва клиент / сървър технология. Файлът, който ние искаме да изтеглите, обикновено се намира на клиентската машина, т.е. потребител, обикновен посетител на сайта. Дестинация - сървър. За да се направи процесът на прехвърляне на файлове, се нуждаем от следния вид:







В полето за действие трябва да бъде URL на вашия PHP-скрипт, който ще продължи да се занимава с обработката на качените файлове. MAX_FILE_SIZE скрито поле трябва да предхожда полето за избор на файл, и да запази максималния размер на файла в байтове. Неговата цел - да провери размера на файла, дори преди да изпратите файл на сървъра. Това би трябвало да облекчи потребителя от дълго и безплодно за качване на файлове на сървъра, и формирането на твърде много трафик, но не особено се разчита на това ограничение, тъй като е лесно да се придвижва.

Какво се случва, когато потребителят избира файл на вашия диск, и натиснете бутона "Изпращане на файл"? Браузърът изпраща преписката на сървъра, където PHP-преводач не го слага в временна директория, я задавате произволно име и изпълнява сценария, определен в полето за действие.

Как трябва да изглежда upload.php?

Когато написването на сценария, въпросът естествено възниква: как да получите информация за изтегления файл и да достигне до файла. Ако използвате PHP 4.1.0 и по-стари, най-добре е да се обърнете към глобалния масив $ _FILES. За всеки изтеглен файл, той съдържа хеш масив със следната информация:

  • $ _FILES [ 'потребителския файл'] [ 'име'] - оригиналното име на файла, като той се вижда на потребителя избор на файл;
  • $ _FILES [ 'потребителския файл'] [ 'тип'] - мим / тип файл, например, може да бъде изображение / GIF; Това поле е полезно да се запази, ако искате да предостави интерфейс за сваляне на свалените файлове;
  • $ _FILES [ 'потребителския файл'] [ 'размер'] - размера на изтегления файл;
  • $ _FILES [ 'потребителския файл'] [ 'tmp_name'] - пълния път до временен файл на диска;
  • $ _FILES [ 'потребителския файл'] [ 'грешка'] - От версия 4.2.0, съдържа кода за грешка, което е 0, ако операцията е била успешна.

Ако настройките на сървъра register_globals = нататък, ще създаде допълнителни променливи на форма $ userfile_name на $, userfile_type, $ userfile_size ... Като се има предвид, че от версия 4.2.0, register_globals настройките по подразбиране на = Изключено използването на тези променливи не се препоръчва, дори ако те идентифицирани. Най-добрият начин да получите информация за файлове за изтегляне - използвайте масив $ _FILES.

За да работите с изтеглените файлове е най-добре да се използват вградени функции и is_uploaded_file на move_uploaded_file, които проверяват дали файлът е изтеглен и да я сложи в указаната папка, съответно. По-подробна информация може да се намери в справочните страници. Не е необходимо да изобретяваме колелото и да работим за временни файлове, копирайте ги, да ги изтриете. Това е направено за вас и за вас.

Създаване на сървъра

Направих всичко по силите си, но имам нещо не работи. Може би не сте конфигурирали на сървъра?

Ако "направи всичко", но кода си, не функционира, или не работи правилно, не бързайте да се отчайва. Може би проблемът не е във вашите ръце, но в настройките на грешни сървър. Ето списък на директивите, които са свързани с теглене на файлове:

  • Ако искате да знаете къде е вашият най php.ini, следвайте
  • file_uploads - възможност да разрешите или предотвратите сваляне на файлове като цяло. По подразбиране On.
  • upload_max_filesize - максималният размер на файл, който може да бъде изтеглен. Ако се налага да работите с големи файлове, да промените тази настройка. По подразбиране 2М. Не забравяйте да се промени post_max_size.
  • post_max_size - обща горна граница за количеството данни, изпратени в искането за POST. Ако се налага да работите с големи файлове, или да изпратите няколко файла наведнъж, да промените тази настройка. Стойността по подразбиране е 8M.
  • upload_tmp_dir - временна директория на сървъра, които ще бъдат поставени на всички изтеглени файлове. Проверете какво сложи дясната (ако на този етап имате проблеми, вижте обяснението в края на статията). Тази директория трябва да съществува и потребителят, при които Apache, също трябва да бъде точно да пише в тази директория. Ако работите с open_basedir ограничение включен - временната директория трябва да е вътре. Не е нужно да се притесняваме за това, или за уникалността на имената, PHP решава този проблем за вас.






В файла httpd.conf:

  • На първо място, уверете се, че използвате уеб сървър Apache 1.3 (най-новата версия, както и на това писание - 01/03/27). Ако използвате Apache 2.0, трябва да прочетете откъс от документацията:

Да не се използва Apache 2.0 и PHP в производствена среда нито на Unix, нито на Windows.

Малък обяснение за тази рецепта: този конкретен проблем, когато файловете са качени на сървъра, не са разопаковани и снимки не се показват, може да има, поради факта, че се използва руски Apache уеб сървър. Директива CharsetDisable забраните набор от знаци за обработка модул единица, т.е. не реализация, когато няма да има сваляне на файлове в тази папка. директива CharsetRecodeMultipartForms забранява транскодиране на данните, изпратени по метода на POST с глава Content-Type: съставното / форм-данни. Т.е. двоични данни, предавани с тази настройка, ще бъдат оставени непокътнати, както и съдържанието на сайта почивка ще се преобразува в съответствие с текущите настройки на сървъра.

Но могат да се появят същите усложнения: Бъдете готови за това, че в някои случаи ще трябва да поиска от текста на повторното кодират свои собствени. Ето какво казват за него в документацията:

Използвайте директивата CharsetRecodeMultipartForms, които се появиха в PL23, но всичко, което все още трябва ръчно да кодира текста на запитването. Можете да използвате руски Apache API, налични в други модули или руски Apache Perl API, на разположение от mod_perl.

Не забравяйте, че след всяка промяна на конфигурацията, трябва да рестартирате вашия уеб сървър.

допълнителните функции

Искам да направя точно такова нещо, но не мога да го направя.

Качване на множество файлове наведнъж

В действителност, в това не представлява трудност. Това може да се постигне чрез използване на, например, че тази форма:

И не забравяйте да се увеличи post_max_size, ако планирате много файлове

Автоматично изтегляне на файлове на сървъра

Съхраняване на файлове в база данни MySQL

Ако ще да съхранявате файлове за изтегляне в базата данни, трябва да се има предвид следните точки:

  • Трябва да използвате поле от тип BLOB
  • Преди да поставите в базата данни, не забравяйте да се прилага за mysql_escape_string на линия
  • Ако даден файл трябва да бъдат посочени съдържание заглавна / тип

Не забравяйте, че дисплеите си HTML скрипт няма нищо общо със сценария, който е за показване на изображението. Тя трябва да бъде два различни приложения.

Съхраняване на изображения в базата данни не е добър стил. Тя е много по-удобно да се съхраняват в базата данни само по пътя на файла с изображението.

Получаване на изображения свойства.

Ако имаше задача пред себе си, за да се провери вида или размера на изображението, преди да качвате файлове към сървъра, трябва да имате функция getimagesize. Като аргумент тя е на името на файла на диска и връща масив, първите два елемента от които - ширината и височината, съответно, а третият - от типа на изображението. Ако не можете да прочетете на правилното изображение от даден файл, функцията връща лъжа.

Качване на файлове с името на рускоезичното

При изтегляне на файлове на сървъра, трябва да потвърдите оригиналните им имена за наличие на "нестандартни" герои (например българските букви). Ако тяхното присъствие е необходимо за смяна. Оригиналното име на файла, може да се намери в променливата $ _FILES [ 'потребителския файл'] [ 'име']. За една идея за това как да конвертирате низ за руски език транслитерация на може да се намери в досиетата на почти всеки форум, посветен на PHP.

Извежда информация за състоянието на изтегляне или прогрес бар

Имайте предвид, че за да завърши изтеглянето на файла, PHP не може да се справи с всеки размер на файла или неговия процент натоварване. Само, когато файлът вече е на PHP сървъра, той е в състояние за достъп до информацията. Ако все още е необходимо да се реализира тази възможност, използвайте Java-аплет.

Кратка скица на файловете за правата на

Проблеми с права на сървъра (upload_tmp_dir)

В * Никс операционни системи от типа, всяка папка файлове, линкове поставени съответните права за достъп. Те могат да изглеждат като rwx-RW-r-, или броя 754.

Файл или директория наличността зависи от потребителско име и група, към която принадлежи той. като цяло, е описано по отношение на три поредици от три букви всеки:

Тук на собственика, на членовете на групата и всички други потребители имат правата на четенето на файла, пишете на него, и го изпълни. Права - всеки смислен комбинация от следните букви:

За да качвате файлове на сървъра, за да функционира правилно, трябва да се приложи една от двете възможности

Един пример за прилагането на зареждане на изображения на сървъра.