#php #file-upload #file-exists
#php #файл-загрузка #файл-существует
Вопрос:
я хочу переименовать загруженный файл, если он уже существует. я хочу переименовать его в img1.jpg ,img2.jpg если они уже существуют. я перепробовал много примеров, но ничто не подходит для этого кода ниже:
<?php
$valid_formats = array(
"jpg",
"png",
"gif",
"zip",
"bmp",
"pdf",
"docx",
"PDF",
"xlxc"
);
$max_file_size = 3024;
$path = "images/"; // Upload directory
$count = 0;
if (isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") {
$fname = $_FILES['attach']['name'];
foreach ($_FILES['attach']['name'] as $f => $name) {
if ($_FILES['attach']['error'][$f] == 4) {
continue;
}
if ($_FILES['attach']['error'][$f] == 0) {
if ($_FILES['attach']['size'][$f] > $max_file_size) {
$message[] = "$name is too large!.";
continue;
}
elseif (!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats)) {
$message[] = "$name is not a valid format";
continue;
}
else {
if (move_uploaded_file($_FILES["attach"]["tmp_name"][$f], $path . $name))
$count ;
}
}
}
}
?>
требуется некоторое обновление для существующих файлов в приведенном выше коде.
Комментарии:
1. Итак, в чем именно заключается ваш вопрос? Нам не нравится вопрос в стиле «сделай мою домашнюю работу за меня». Вы получаете какие-либо ошибки? Что работает, а что нет? Ваш фрагмент кода включает в себя много проверок и т. Д., Которые могут быть опущены в вашем вопросе.
2. используется
file_exists
для проверки, существует ли файл или каталог3. почему вы используете rename… пожалуйста, время, как вещь, не перезаписывайте оригинал
4. @ Damien Overeem я пробовал все, как я could…am не прошу делать мою домашнюю работу
Ответ №1:
Попробуйте это:
before moving the file to server put this check
$fname = $_FILES['attach']['name'];
if(file_exist($path))
{
$file = explode($fname); // explode file name and extension
$rand = rand(1, 100);
$fname = $file[0].'.'.$rand.$file[1]; // combine file name with some random value with extension
}
// Now fname will contain the original name or modifed name in it
// You can maintain a counter instead of random value that gives you 1,2,3 ...
Ответ №2:
Вы могли бы попробовать заменить
else{
if(move_uploaded_file( $_FILES["attach"]["tmp_name"][$f], $path.$name ))
$count ;
}
с
else {
$targetfile = $path . $name;
if( file_exists( $targetfile ) ){
/* get filename amp; extension from target file */
$filename=pathinfo( $targetfile, PATHINFO_FILENAME );
$extension=pathinfo( $targetfile, PATHINFO_EXTENSION );
/* if the last character of the file's name is a digit, increment by one */
$lastchar = intval( substr( $filename, strlen( $filename )-1 ) );
if( $lastchar amp;amp; !is_nan( $lastchar ) ) {
/* Get the actual integer value from the end of the filename */
preg_match( '@d $@', $filename, $matches );
if( !empty( $matches ) ) $lastchar=$matches[0];
/* Remove original number and replace with new incremented value */
$filename = substr( $filename, 0, strlen( $filename ) - strlen( $lastchar ) ) . ( $lastchar 1 );
} else {
/* last character was not a digit, add '1' to filename */
$filename.='1';
}
/* determine new file's path */
$targetfile = $path . $filename . '.' . $extension;
clearstatcache();
}
if( move_uploaded_file( $_FILES["attach"]["tmp_name"][$f], $targetfile ) ) $count ;
}
Он должен определить, существует ли файл уже в указанной целевой папке — если он существует и имеет целое число в качестве последней части его имени, он должен увеличить это значение на единицу и создать новое имя файла. Если целое число отсутствует, следует просто добавить ‘1’, но если файл не существует, он будет использовать исходное имя.