Качване на големи файлове

Материал от PhpWiki.

Тази страница обсъжда препоръчителното изтегляне на големи файлове през браузър чрез HTTP протокол. Дават се отговори на въпросите „Кой и как може да ограничи размера на качените файлове?“ и "Какво не е наред с качването на големи файлове чрез HTTP протокол?". Разгледани са предпоставките за възникване на проблема и начините за преодоляването му.

Съдържание

Кой може да ограничи размера на качените файлове?

  • самата RNR. Внимателно проучете всички PHP настройки, за да разберете как размерът на качените файлове може да бъде ограничен.
  • HTTPD (напр. Apache сървър). Внимателно проучете всички настройки на вашия сървър, за да разберете как вашият сървър може да ограничи размера на качените файлове.
  • вашия браузър. Проучете настройките и документацията за вашия браузър, за да разберете как той може да ограничи размера на изтеглените файлове. Вижте също HTML спецификацията: много браузъри поддържат ограничения за размера на файла за качване, посочени в специални полета type="h > Как може да се ограничи размерът на файл за качване?
  • определяне на максималния размер на качените файлове (основно в PHP и в браузъра). Например в PHP това е post_max_size. В браузърите това ограничение може да бъде зададено, например, чрез указване на полето type="h > Защо качването на големи файлове чрез HTTP протокола е лошо?
  • при използване на бавни модемни връзки, при изтегляне на голям файл връзката може да бъде прекъсната. В този случай няма да можете да изтеглите файла. Няма техническа възможност за решаване на този проблем.
  • В повечето FTP браузъри качването на файл през FTP е същото, както ако копирате файлове от локално устройство. От тази гледна точка FTP браузърът е по-удобен за прехвърляне на файлове от HTTP браузъра.

Ако вВъв вашия случай това не е така, а защото и само защото никога не сте работили (или много рядко работите) с FTP браузъри. Изберете удобен FTP браузър за себе си, използвайте го постоянно и ще откриете, че изтеглянето на файлове с него е много по-лесно, отколкото използването на HTTP браузър.

  • за разлика от FTP браузърите, повечето HTTP браузъри не показват напредъка на прехвърлянето на файлове или го показват само много грубо. В повечето случаи HTTP браузърите не показват оставащото време до края на изпращането на формуляра към сървъра.
  • увеличаването на количеството изтеглени данни може значително да намали сигурността на вашите скриптове. Проблемът е свързан с това, че настройките за количеството качени данни засягат ВСИЧКИ качени данни.

Например, ако увеличите обема на качените данни до 100 MB и в някое поле на една от формите на вашия сайт, което не е свързано с качване на файлове, а например свързано с промяна на потребителски данни, подадете някакъв цифров идентификатор (например номера на месеца на рождения ден на този потребител, който на теория трябва да е число от 1 до 12), който замествате в SQL заявката, тогава трябва да се подготвите за предаването на злия хакер това поле не е число от 1 до 12, но ще зареди всичките 100 MB там. Ако не сте настроили сървъра на вашата база данни да обработва много големи заявки (по подразбиране в My SQL е около 16 MB), тогава такава заявка ще доведе до грешка, която хакерът ще използва.

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

Какво причини проблема?

Този протокол обаче позволява прехвърлянето на данни от потребителя към сървъра. Създаден е затака че сървърът да може динамично да генерира страници, в зависимост от входящите данни. Например, самият Apache поддържа възможността за изброяване на файлове, което позволява на потребителите да сортират списъка по различни начини. Методът на сортиране е зададен в променлива, която се предава от метода GET.

Характеристика на протокола TCP / IP (а именно този протокол е следващият в протоколния стек при прехвърляне на данни чрез HTTP) е, че той не прехвърля файлове, а пакети. Това означава, наред с други неща, че без да се знае дължината на данните, е невъзможно да се каже кога да приключи четенето на данните. Самите данни трябва да са такива, че да можете да разберете кога са приключили. Например заглавките завършват, когато пристигне знак за нов ред. И дължината на тялото на заявката може да бъде указана в заглавки (с помощта на заглавката Content-Length). Повечето спецификации на протоколи изискват заглавките да не са твърде дълги; като правило максималната дължина на един хедър е ограничена от порядъка на 256 байта до 8192 KB.

Следователно друг недостатък на метода GET е свързан с ограничения обхват на прехвърлените променливи. Ограничението възникна поради ограничение на дължината на един хедър в HTTP заявка и поради липсата на техническа възможност за посочване на действителната дължина на данните.

Тъй като HTTP позволява предаването на данни, самият HTML включва средства за потребителите да посочват тези данни. Формите са такава среда. Например, когато оставите съобщение във форум, вие попълвате формуляр и го изпращате на сървъра чрез метода POST.

Първоначално HTTP спецификацията изобщо не предвиждаше такава възможност като прехвърляне на файлове. Въпреки това качването на файлове с помощта на формуляр в браузър често е удобна функция, така бешебеше измислена отделна спецификация - HTTP разширението, което ви позволява да прехвърляте файлове (RFC 1867).

Повечето съвременни хора не помнят онези времена, когато беше невъзможно да прехвърлят файлове към сървъра през браузъра и не знаят как работи целият процес на прехвърляне на файлове вътре. Следователно на много съвременни програмисти изглежда, че увеличаването на размера на файловете, предавани чрез HTTP, е свързано само с добавяне на нули (за увеличаване на реда на числата) в съответните настройки.

Когато програмирате за Интернет, винаги трябва да помните това

  • HTTP е предназначен за прехвърляне на хипертекстови страници от сървъра към браузъра на потребителя
  • HTTP НЕ е предназначен за прехвърляне на файлове от потребителя към сървъра

Всичко това е така, защото:

  • FTP е предназначен за прехвърляне на всякакви файлове във всяка посока
  • FTP НЕ е предназначен за прехвърляне на хипертекстови страници

Как да постигнете големи качвания на файлове?

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

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

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

Първо опитайте да увеличитестойностите на настройките, връзките към описанието на които са в раздела „Как може да се ограничи размерът на качените файлове?“.

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

Например, PHP настройките могат да бъдат записани във файловете php.ini, .htaccess, httpd.conf или могат да бъдат зададени директно в скрипта. Същото време за изпълнение на скрипта може да бъде зададено от функцията set_time_limit(). Много настройки могат да се променят с функцията ini_set().

Настройките на сървъра на Apache могат да бъдат зададени в httpd.conf, но много от тях могат да бъдат заменени в .htaccess. За всяка отделна директория са засегнати всички .htaccess файлове, намерени във всички родителски директории. Следователно, дори ако няма .htaccess файл в текущата директория или няма промяна в настройките, от които се нуждаете, пак трябва да проверите всички родителски директории. Освен това настройките могат да бъдат написани в различни контексти. Например, ако LimitRequestBody е указано в контекста, тогава то ще има предимство пред глобалната дефиниция. И дори това не е всичко: някои настройки може да бъдат забранени за промяна с помощта на други настройки.

Трябва да се помни, че max_execution_time и max_input_time могат да бъдат еднакви на различни сървъри, но на по-бърз сървър голям файл ще има време за изтегляне през това време, а на по-бавен сървър (или на същия сървър, но в пиковите моменти, когато много потребители имат достъп до сървъра), със същите настройки, същият файл вече няма да се изтегля.

Има и случаи, когато на компютъра се съхраняват няколко копия на файлове с настройки и програмистът променя един от тях, а сървърът зарежда друг. Често променяйте настройките и забравятеслед това рестартирайте сървъра.

Ако промяната на настройките не помогне, следвайте препоръките в раздела „Кой може да ограничи размера на качените файлове?“, Тоест, проучете всички настройки (а не само описаните в тази статия) във всички програми, които използвате. Можете да започнете, като потърсите всички настройки, които съдържат думата качване или ограничение. След това погледнете всички останали.

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

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

Качването на големи файлове през HTTP не е технология, а изкуство.

Просто решение на проблема

Използвайте FTP за качване на големи файлове на сървъра.

Ако качените файлове трябва да бъдат обработени по някакъв начин от PHP скрипт, това може да стане с помощта на CRON за периодично изпълнение на вашите скриптове или чрез щракване върху специален бутон в уеб интерфейса. Когато стартирате скрипта си, той търси нови файлове, качени през FTP, и ги обработва по начина, по който сте искали да ги обработвате преди, като ги качва с помощта на метода HTTP POST. Ако вашият локален компютър има специален IP и вие сами качвате файлове на сървъра

Решение, предложено от Krom.

Най-простият ftp се инсталира на локалния компютър. На сървъра предписвате ip, потребителско име и парола. Ако няма cron, тогава просто чрез достъп до страницата на сървъра проверявате локалния ftp, качвате файлове на сървъра, автоматично правите връзки и т.н. Тези. никаква намесавсичко работи.

Ако имате нужда от описание на файловете и допълнителна информация, отидете в админ панела и добавете необходимите данни. В същото време на страницата ви се дава целият списък с качени файлове или тези, които все още са на локален ftp. Под тях има полета за допълнителна информация, отметки и др. Напълни всичко, натисна OK и отиде да пуши. Самата програма ще изтегли необходимите файлове и ще ги постави в публичен достъп. Вижте също

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

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

  • Кратко отклонение в качване на файлове, настройка на сървър, качване на множество файлове, автоматично качване на файлове на сървъра, съхраняване на файлове в база данни, качване на файлове с български имена, показване на статус на качване или прогрес лента, примерни скриптове.
  • PHP документация. Глава 38. Работа с качвания на файлове.
  • RFC 1867. Качване на файл на базата на формуляр в HTML.
  • RFC 1945 Hypertext Transfer Protocol - HTTP/1.0
  • RFC 2616 Протокол за прехвърляне на хипертекст - HTTP/1.1

Програми, които могат да ви помогнат

Аплет за качване на файлове

Лента за напредък на мега качване

Благодаря

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