Как предотвратить пустые файлы в html-форме при переполнении стека

У меня есть веб-сайт, на котором пользователи заполняют форму и загружают свои резюме (Curriculum Vitae). В 95% случаев он работает как надо, и я получаю файл CV на сервере. Хотя я пытался, я никогда не смог воспроизвести ошибку 5% пользователей, которые терпят неудачу. Я знаю, что большинство из них использует Android для загрузки файлов, но не все из них. У нас даже есть пользователи Chrome, работающие на Windows 7, которые не работают, поэтому проблема может быть в плохом соединении. Я все еще не смог воспроизвести ошибку.

Это упрощенная версия формы:

<html>
<form action="get_file.php" method="POST" enctype="multipart/form-data">
Here goes the file: <input name="curriculo" type="file"><br>
<input type="submit">
</form>
</html>

И это упрощенная версия того, что у меня есть на сервере.

<pre>
<?php
print_r($_FILES);
?>
</pre>

Это то, что я получаю в 95% случаев, и это нормально:

Array
(
[curriculo] => Array
(
[name] => cora.rtf
[type] => application/msword
[tmp_name] => /tmp/phpk0caxk
[error] => 0
[size] => 542
)
)

И это остальные 5% (не хорошо!)

Array
(
[curriculo] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

)

Array
(
[curriculo] => Array
(
[name] => curriculo.odt
[type] =>
[tmp_name] =>
[error] => 3
[size] => 0
)

)
Array
(
[curriculo] => Array
(
[name] => jeisuana_almeida_de_sousa_jeise.pdf
[type] => application/pdf
[tmp_name] => /tmp/php7QmGOk
[error] => 0
[size] => 0
)

)

В последнем примере обратите внимание, что файл сделал это без каких-либо ошибок, но его размер равен 0, что также является проблемой.

У меня есть это на моем php.ini:

file_uploads = On
upload_max_filesize = 6M
max_file_uploads = 20

Я знаю, что если размер файла превышает upload_max_filesize, файл не создается. Это не относится к делу. Когда размер файла превышает 6 МБ, массив $ _FILES пуст, и я соответствующим образом лечу эту ошибку.

Я также знаю, что это за коды ошибок. Они задокументированы здесь.

http://php.net/manual/en/features.file-upload.errors.php

Мой вопрос: есть ли что-то, что я пропускаю, чтобы предотвратить потерю этих 5% резюме? Любая конфигурация? Или, может быть, проблема определенно в дерьмовых подключениях пользователей?

Как я уже сказал, я получаю эти ошибки либо с пользователями на Android, либо с Chrome / Safari / Firefox на Windows / Mac.

Спасибо!

1

Решение

Почему бы не проверить размер файла, прежде чем делать что-либо? Что-то вроде:

<?php
if (isset($_FILES) && $_FILES['size'] > 0) {
// Do stuff here
}
?>
1

Другие решения

Вместо использования традиционного <form> с type="submit" Нажмите кнопку AJAX и предоставьте мгновенный отзыв, если файл не получен.

Если у вас не было AJAX до этого, вот несколько хороших сообщений для получения основ. Это много проще, чем кажется.

Простой пример

Более сложный пример

Заполните раскрывающийся список 2 на основе выбора в раскрывающемся списке 1


Кроме того, проверьте плагин загрузки файлов JQuery Ravishanker Kusuma’s Hayageek:

http://hayageek.com/docs/jquery-upload-file.php

Он разбивает процесс на три простых шага, которые в основном выглядят так:

<head>
<link href="http://hayageek.github.io/jQuery-Upload-File/uploadfile.min.css" rel="stylesheet">  // (1)
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://hayageek.github.io/jQuery-Upload-File/jquery.uploadfile.min.js"></script>   // (1)
</head>
<body>
<div id="fileuploader">Upload</div>  // (2)
<script>
$(document).ready(function(){
$("#fileuploader").uploadFile({  // (3)
url:"my_php_processor.php",
fileName:"myfile"});
});
</script>
</body>

Последний шаг — указать файл PHP в коде jQuery (в данном случае my_php_processor.php) получить и обработать файл:

my_php_processor.php:

<?php
$output_dir = "uploads/";
$theFile = $_FILES["myfile"]["name"];
move_uploaded_file($_FILES["myfile"]["tmp_name"],$output_dir.$fileName);

Обратите внимание на связь между myfile в PHP ($_FILES["myfile"]) и имя файла, указанное в блоке кода jQuery.

1

По вопросам рекламы [email protected]