2013-04-22 2 views
0

У меня есть простая форма PHP, которая отправляет электронные сообщения на некоторые текстовые данные и вложение одного файла. Все работает нормально, пока загрузка не нарушает никаких ограничений на сервере, например размер или время выполнения. Когда файл нарушает эти ограничения, браузеры показывают, что загрузка 0% - 100% просто прекрасна, но вместо отправки формы страница просто обновляется, и данные POST не отправляются.Загрузка большого файла в PHP Прерывание формы

У меня нет возможности увеличить лимит. Я работаю над проектом, где я не могу увеличить пределы для размера загрузки или времени выполнения через php.ini, .htaccess или ini_set(). Это нормально, и я в порядке с лимитами, предоставленными мне хостинговой компанией этого конкретного клиента.

Однако мне просто нужен удобный способ отправки формы, когда пользователь пытается загрузить большой файл, превышающий лимиты, вместо полного завершения выполнения и обновления страницы без данных POST. На этом этапе я даже не могу показать какую-либо ошибку пользователю при отправке, например, «Файл должен быть не более 10 МБ», так как форма никогда не отправляется, когда файл слишком велик.

Пожалуйста, дайте мне знать, если требуется какое-либо разъяснение.

+0

Он должен выбросить ошибку 'UPLOAD_ERR_INI_SIZE', которую вы можете поймать. – elclanrs

+0

Я предположил, что это был размер, вызывающий проблему, но я не вижу ошибок в моем журнале. Что еще может быть причиной этого, кроме размера? Память? Время исполнения? Я надеялся, что по крайней мере увижу какую-то ошибку, но я этого не сделаю. – jackrugile

+0

возможно ли разрешение? У вас есть разрешение на загрузку в каталог, в который вы загружаете? – doliver

ответ

1

Очевидно, что если ваш сценарий используется для отправки файла в виде вложения электронной почты, это правда, что ваш файл должен быть меньше 10Mo, потому что многие почтовые серверы отклонят больше писем.

По соображениям безопасности вы не можете получить информацию о файле из браузера. Но как только файл будет выбран в поле файла формы, вы можете использовать API-интерфейс HTML5. See this page for a complete presentation.

Вот часть кода вам нужно будет обрабатывать размер файла перед отправкой:

<input type="file" id="a_file" name="a_file" /> 
<script> 
    function fileSelect(evt) { 
    var file = evt.target.files[0]; 
    var size_mo = (file.size/(1024 * 1024)).toFixed(3); 

    if (size_mo >= 10) 
    { 
     alert('Your file is too big ('+size_mo+'Mo).'); 
     // eventually reset the form with window.your_form.reset() to avoid submit 
    } 
    else 
    { 
     alert('Your file is ready for upload ('+size_mo+'Mo)'); 
    } 
    } 
document.getElementById('a_file').addEventListener('change', fileSelect, false); 
</script> 

Однако это решение будет поддерживать только уточненный браузеры и не совместим с версиями Internet Explorer ниже 10.

Нет другого решения, использующего HTML или JS. Если вам нужна полная поддержка, вам понадобится Flash или Java (имейте в виду, что есть компьютеры, у которых эти технологии не установлены). Так что лучше всего использовать код HTML5 с обнаружением браузера и не тревожить пользователя, если вы не можете прочитать размер файла и иметь хорошее поведение, если поддерживается HTML5.

+0

Это решение отлично выглядит, у этого конкретного клиента много трафика ie7 - ie9, хотя и не поддерживает API файлов HTML5. Любые дополнительные решения для этих браузеров? Ссылка: http://caniuse.com/fileapi – jackrugile

+0

@jackrugile Невозможно сделать это с помощью HTML или JS с поддержкой IE9 или ниже. Вы можете использовать Java-апплет, запрашивающий права на чтение файловой системы или использование Flash-приложения. – ffarquet

+0

@jackrugile Я обновил свой ответ. Так что теперь оно завершено. – ffarquet

Смежные вопросы