У меня есть веб-сайт, на котором пользователи заполняют форму и загружают свои резюме (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.
Спасибо!
Почему бы не проверить размер файла, прежде чем делать что-либо? Что-то вроде:
<?php
if (isset($_FILES) && $_FILES['size'] > 0) {
// Do stuff here
}
?>
Вместо использования традиционного <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.