Мне нужно переименовать файлы, загруженные на сервер с помощью php, и добавить метку времени в файл. Я написал код, и он показывает это, например: logicgates.docx-29-Aug-2018 19-55-36.docx
вместо: logicgates-29-Aug-2018 19-55-36.docx без расширения файла в середине имени файла.
<?php
session_start();
date_default_timezone_set('Africa/Harare');
$date = date("d-M-Y H-i-s");
//$time = time("h-i-sa");
$targetfolder = "uploads/";
$allowedMimes = ['application/pdf','application/msword','text/plain','application/vnd.openxmlformats-officedocument.wordprocessingml.document',];
$targetfolder = $targetfolder . basename( $_FILES['file']['name']) ;
$type=pathinfo($targetfolder,PATHINFO_EXTENSION);
$ok=1;
$file_type=$_FILES['file']['type'];
if (in_array($_FILES['file']['type'], $allowedMimes))
{
if (move_uploaded_file($_FILES['file']['tmp_name'], $targetfolder))
{
//add date and time stamp to the uploaded file
if (file_exists($file_type))
{
$_SESSION['message']= "Sorry, file already exists. Please rename if you still want to upload it.";
header("location:lecsubmit?error") ;
}
else{
rename("uploads/".$_FILES['file']['name'],"uploads/".$_FILES['file']['name']."-".$date.".".$type);
$_SESSION['message'] = "The file ". basename( $_FILES["file"]["name"]). " submitted successfully.";
header("location:lecsubmit?done") ;
}
}
else {
$_SESSION['message']= "Sorry, your file was not uploaded.";
header("location:lecsubmit?error") ;
}
}
else {
$_SESSION['message']= "You may only upload PDFs, DOCXs, DOCs or TXT files..";
header("location:lecsubmit?error") ;
}
?>
Очевидно, что $_FILES['file']['name'] содержит полное имя файла с расширением. Вместо использования $_FILES['file']['name'] возьмите его значение, удалите расширение и добавьте дату в конец, а затем верните расширение.
в @JohnConde было бы лучше, если бы вы показали код.






Найдите последнюю точку ".", Вырежьте левую часть, добавьте отметку времени и добавьте правую часть:
$file = "uploads/" . $_FILES['file']['name'];
$lastDot = strrpos($file, '.');
$newFile = substr($file, 0, $lastDot) . "-$date." . substr($file, $lastDot + 1);
rename($file, $newFile);
Обновлено: Изменен подход str_replace на подход strrpos, предложенный @Elementary.
Это действительно плохой способ продолжить, например, doc.123manuel.doc будет 123manuel. Это то, что нужно оператору?
нет, смотри лучше, я заменяю «.doc», а не просто «doc».
но если имя файла - «my.document.doc», результатом будет «myument.timestamp.doc», это будет неверно.
Так что вы можете проголосовать за мой ответ и отредактировать свой, чтобы он соответствовал требованиям. Вы можете использовать str_replace, но вам нужно указать последнее вхождение точки в качестве смещения, чтобы начать замену.
вы можете сначала удалить расширение:
rename("uploads/".$_FILES['file']['name'],"uploads/".substr($_FILES['file']['name'],0,strrpos($_FILES['file']['name'],'.'))."-".$date.".".$type);
это неправильно, если имя файла содержит точки, например «my.file.doc», результатом будет «my.timestamp.doc» вместо «my.file.timestamp.doc»
Я ищу только последнее появление точки. Вы должны узнать больше о strrpos. Ваш заменит любое вхождение типа в имени файла и является неправильным. Например, doc.doxit.doc будет преобразован в .doxit
Я не вижу дополнительной буквы "r" на вашем strrpos, извините, вы правы
Используйте только функцию
time().