У меня есть простая контактная форма с загрузкой файлов. Я получил следующее предупреждение, но я хотел бы сделать сообщение об ошибке для пользователей, что этот файл больше, чем предел. Да, я знаю, что могу отключить сообщение «Warning: POST Content-Length …», если я отключаю error_reporting, но я бы предупреждал пользователей. Еще одна проблема возникла, когда я заполняю контактную форму и пытаюсь загрузить больший файл, нажимаю «Отправить», и все мои заполненные поля будут пустыми. Есть ли способ получить сообщение об ошибке и не потерять заполненные поля?
Вы можете сначала сделать это в Javascript, чтобы даже до того, как файл попадет на сервер, Javascript предупредит / сообщит пользователю, что размер файла превышает максимально допустимый размер. Здесь ниже приведен пример, который вы можете хорошо проверить и поиграться с первым Вот.
<html>
<head></head>
<body>
<input type="file" id="file_upload_1" name='file_upload_1' class="file_upload"/>
<!-- AND THEN, OTHER INPUT FORM FIELDS FOLLOW -->
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
(function($) {
$(document).ready(function(){
var fileInput = $("#file_upload_1");
var MaxAllowedSize = 2000; // 2KB
var sizeKMGB = "2KB";
fileInput.on("change", function(evt){
var objFile = $(this);
var fileSize = document.getElementById("file_upload_1").files[0].size;
console.log(fileSize);
if(fileSize > MaxAllowedSize){
// RESET THE UPLOAD TO NOTHING... SO USER CAN UPLOAD AGAIN...
var fSize = parseFloat(fileSize/1000).toFixed(2);
var sUnit = fSize + "KB";
if(fSize >= 100){
fSize = parseFloat( fileSize/(1000*1000)).toFixed(2);
sUnit = fSize + "MB";
}
objFile.val(null);
alert("Upload File-size Must not exceed " + sizeKMGB + ". \nYou tried to upload a File with about " + sUnit + ".")
}
});
});
})(jQuery);
</script>
</body>
</html>
Что я сделал, так это построил ajax-скрипт для проверки максимального размера файла. Таким образом, мы можем предупредить пользователей до они загружают большой файл. Намного приятнее, чем при неудачной загрузке.
Сначала javascript (в примере используется jQuery, но это ни в коем случае не обязательно):
var max_size = // Insert ajax code to fetch max size *in bytes* from server here.
$('form input[type="file"]').each(function() {
if ((typeof this.files != 'undefined') && this.files.length) {
total_size += this.files[0].size;
}
});
if (max_size < total_size) {
var warning = 'Maximum file size is ' + max_size + ' bytes';
return;
}
На стороне сервера максимальный размер загрузки определяется наименьшее из этих трех значений:
function max_size() {
return Size::smallest(
Size::str_to_bytes(ini_get('post_max_size')),
Size::str_to_bytes(ini_get('memory_limit')),
Size::str_to_bytes(ini_get('upload_max_filesize'))
);
}
Написание str_to_bytes
а также smallest
функции оставлены в качестве упражнения для читателя.