У меня есть такая форма, в которой требуется загрузить несколько файлов (до 10 файлов). Вот как выглядит HTML:
<form action="fileupload.php" method="post" enctype="multipart/form-data">
<tr><td><input type="hidden" name="consultant_id" value="<?php echo $consult_id; ?>"></td></tr>
<tr><td>Offer letter:</td><td> Doc: <input type="file" name="myfile[]"></td></tr>
<tr><td>Project acceptance agreement:</td><td> Doc: <input type="file" name="myfile[]"></td></tr>
<tr><td>Employee book:</td><td> Doc: <input type="file" name="myfile[]"></td></tr>
<tr><td>W4 :</td><td> Doc: <input type="file" name="myfile[]"></td></tr>
<tr><td>State W4 :</td><td> Doc: <input type="file" name="myfile[]"></td></tr>
<tr><td><input type="submit" name="submit" value="Upload"> </td></tr>
</form></table>
Я хочу загрузить файлы на сервер и сохранить их соответствующие пути в базе данных (MySql). Теперь следующий php-код отлично работает, когда я ввожу данные во все поля файла (загружаю все 10 файлов), но не работает, когда я хочу загрузить только некоторые файлы (скажем, 5). Вот код:
<?php
$consultant_id = $_POST['consultant_id'];
echo $consultant_id;
$verified_start_date = $_POST['verified_start_date'];
// Assign valid types
$valid_mime = array(
'application/pdf',
'image/jpeg',
'image/jpg',
);
function upload($files, $dir, $size_limit=1024, $prevent_duplicate=false){
global $valid_mime;
// $files must be given.
if(!isset($files)) return false;
// Look for $valid_mime array.
isset($valid_mime) and is_array($valid_mime) or die('Error in data resources, valid_mime array not found.');
// Make directory if it does not exists. set permission to 0777.
is_dir($dir) and chmod($dir, 0777) or mkdir($dir, 0777, true);
//is_dir($consultant_id) and ($dir, 0777) or mkdir($dir/$consultant_id, 0777, true);
$count = 1;
foreach($files as $file){
$file['error'] === UPLOAD_ERR_OK or die('Error in uploading file(s).');
// Check uploaded-file type.
in_array($file['type'], $valid_mime) or die();
// Set size_limit in KB.
$file['size'] > $size_limit*1024 and die('The uploaded file exceeds the maximum file size.');
$file_extension = strrchr($file['name'], '.');
$filename = basename($file['name'], $file_extension);
$file_path = "{$dir}/{$filename}{$file_extension}";
// Move uploaded-file from php temp folder to desire one.
move_uploaded_file($file["tmp_name"], $file_path);
// Make an array of filepaths
$output[] = $file_path;
}
// Change permission of folder according to security issues.
chmod($dir, 0755);
return $output;
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Controller Section ////////////////////////////////
// Assign tmp_arr from $_FILES['myfile'] and do die if there is any problem.
$tmp_arr = (isset($_POST['submit']) and isset($_FILES['myfile'])) ? $_FILES['myfile'] : die('Error in posting data.');
// Create an array with desired structure.
for($i=0; $i<count($tmp_arr['name']); $i++){
$files[] = array(
'name' => $tmp_arr['name'][$i],
'type' => $tmp_arr['type'][$i],
'tmp_name' => $tmp_arr['tmp_name'][$i],
'error' => $tmp_arr['error'][$i],
'size' => $tmp_arr['size'][$i],
);
}
// size_limit in KB
$path_arr = upload($files, './public/'.$consultant_id, 1024, true);
?>
Я не упомянул ту часть, где данные вводятся в базу данных, так как я знаю, что проблема где-то в $ tmp_arr ['error'] [$ i] или $ file ['error'] === UPLOAD_ERR_OK or die ('Error in загрузка файла (ов). ');
Взгляни, пожалуйста.
1 ответ
Проблема заключается в том, что при вводе пустого файла возвращается значение 'error'
, равное 4, что означает UPLOAD_ERR_NO_FILE
. Так как поле не соответствует UPLOAD_ERR_OK
, вы немедленно останавливаете весь код, вызывая die
, останавливая любые файлы после первого пробела от копирования. Если первое поле было пустым, в move_uploaded_file
ничего не попадало. Если третий из десяти был пустым, то первые два файла будут скопированы, а когда третий будет обработан, все остальные файлы остановятся. Но вы все равно просто увидите ошибку «Ошибка при загрузке файла (ов)».
Редактировать:
<?php
$consultant_id = $_POST['consultant_id'];
echo $consultant_id;
$verified_start_date = $_POST['verified_start_date'];
// Assign valid types
$valid_mime = array(
'application/pdf',
'image/jpeg',
'image/jpg',
);
function upload($files, $dir, $size_limit=1024, $prevent_duplicate=false){
global $valid_mime;
// $files must be given.
if(!isset($files)) return false;
//please use proper if statements. This is confusing.
//isset($valid_mime) and is_array($valid_mime) or die('Error in data resources, valid_mime array not found.');
// Look for $valid_mime array.
if(!isset($valid_mime) || !is_array($valid_mime)) {
die('Error in data resources, valid_mime array not found.');
}
//please use proper if statements. This is confusing.
// is_dir($dir) and chmod($dir, 0777) or mkdir($dir, 0777, true);
// Make directory if it does not exists. set permission to 0777.
if(!is_dir($dir)) {
mkdir($dir, 0777, true);
} else {
//try to chmod if the directory does exist
chmod($dir, 0777);
}
if(!is_writable($dir)){
die('Error unable to write to specified directory.');
}
foreach($files as $key=>$file){
//switch case on the error code
//you can find a list of these error codes at: http://php.net/manual/en/features.file-upload.errors.php
switch($file['error']){
default:
//triggered if an unknown error happened. Newer php versions might bring new constants.
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'An unknown error occurred');
break;
case UPLOAD_ERR_INI_SIZE:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'File size exceeds ini setting');
break;
case UPLOAD_ERR_FORM_SIZE:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'File size exceeds MAX_FILE_SIZE setting');
break;
case UPLOAD_ERR_PARTIAL:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'File was only partially uploaded');
break;
case UPLOAD_ERR_NO_FILE:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'File input was blank');
break;
case UPLOAD_ERR_NO_TMP_DIR:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'Missing temporary folder');
break;
case UPLOAD_ERR_CANT_WRITE:
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'Failed to write file to disk');
break;
case UPLOAD_ERR_OK:
//upload worked fine
// Check uploaded-file type.
if(in_array($file['type'], $valid_mime)){
// Set size_limit in KB.
if($file['size'] <= $size_limit*1024){
//get the file extension.
$file_extension = strrchr($file['name'], '.');
//get the filename
$filename = basename($file['name'], $file_extension);
//full filename and path
$file_path = "{$dir}/{$filename}{$file_extension}";
// Move uploaded-file from php temp folder to desire one.
// function returns true if the move was successful
if(move_uploaded_file($file["tmp_name"], $file_path)){
$output[$key] = array('error'=>false, 'message'=>'File was uploaded successfully', 'file'=>$file_path);
} else {
$output[$key] = array('error'=>true, 'message'=>'Unspecified error when moving the uploaded file');
}
} else {
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'The uploaded file exceeds the maximum file size');
}
} else {
//log error for this file
$output[$key] = array('error'=>true, 'message'=>'Failed to write file to disk');
}
}
}
// Change permission of folder according to security issues.
chmod($dir, 0755);
return $output;
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Controller Section ////////////////////////////////
// Assign tmp_arr from $_FILES['myfile'] and do die if there is any problem.
$tmp_arr = (isset($_POST['submit']) and isset($_FILES['myfile'])) ? $_FILES['myfile'] : die('Error in posting data.');
// Create an array with desired structure.
for($i=0; $i<count($tmp_arr['name']); $i++){
$files[] = array(
'name' => $tmp_arr['name'][$i],
'type' => $tmp_arr['type'][$i],
'tmp_name' => $tmp_arr['tmp_name'][$i],
'error' => $tmp_arr['error'][$i],
'size' => $tmp_arr['size'][$i],
);
}
// size_limit in KB
$path_arr = upload($files, './public/'.$consultant_id, 1024, true);
Если бы я делал это, я бы использовал эту функцию. Если с одним загруженным файлом возникнет проблема, это не остановит загрузку остальных файлов и преобразует ключ 'error'
из $ _FILES в более удобное сообщение. Вы можете легко перебрать возвращаемый массив и проверить логический ключ error, чтобы увидеть, есть ли проблема в конкретном файле. Если 'error' истинно, вы можете повторить сообщение, чтобы пользователь мог его увидеть. Если ошибки не было, может отображаться сообщение «Файл был успешно загружен». Ключи из возвращаемого массива соответствуют тем же ключам, что и в переданном массиве. Таким образом, $ file [0] - это тот же файл, что и $ returnResult [0] для удобства.
die
?
'error'
UPLOAD_ERROR_NO_FILE
, прежде чем выполнять остальные проверки, и просто пропустить его, если оно пусто. Кроме того, использование die
в этих ситуациях, вероятно, вызовет больше проблем, потому что вы не сможете увидеть, каковы оставшиеся проблемы. Попробую немного почистить для вас и показать, как может быть лучше.
error
отчетность. Я пробовал использовать "error
равно UPLOAD_ERR_NO_FILE
", не повлияет ли это на файлы, которые я хочу загрузить (UPLOAD_ERR_OK
файлов)
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
multiple
, возможно, проблема.$_FILES
. Как вы справляетесь<input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" />
, это может быть проблема, а может и нет, просто подумал, что упомяну об этом.multiple=""
означает, что пользователь может выбрать несколько файлов для заданного входного тега.