Добавление отметки времени к имени файла с помощью php

Мне нужно переименовать файлы, загруженные на сервер с помощью 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") ;
}
?>

Используйте только функцию time().

akshaypjoshi 29.08.2018 20:11

Очевидно, что $_FILES['file']['name'] содержит полное имя файла с расширением. Вместо использования $_FILES['file']['name'] возьмите его значение, удалите расширение и добавьте дату в конец, а затем верните расширение.

John Conde 29.08.2018 20:12

в @JohnConde было бы лучше, если бы вы показали код.

Rayobeats 29.08.2018 22:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
196
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Найдите последнюю точку ".", Вырежьте левую часть, добавьте отметку времени и добавьте правую часть:

$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. Это то, что нужно оператору?

Elementary 29.08.2018 20:47

нет, смотри лучше, я заменяю «.doc», а не просто «doc».

Charles Cavalcante 29.08.2018 20:51

но если имя файла - «my.document.doc», результатом будет «myument.timestamp.doc», это будет неверно.

Charles Cavalcante 29.08.2018 21:06

Так что вы можете проголосовать за мой ответ и отредактировать свой, чтобы он соответствовал требованиям. Вы можете использовать str_replace, но вам нужно указать последнее вхождение точки в качестве смещения, чтобы начать замену.

Elementary 29.08.2018 21:38

вы можете сначала удалить расширение:

 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»

Charles Cavalcante 29.08.2018 20:33

Я ищу только последнее появление точки. Вы должны узнать больше о strrpos. Ваш заменит любое вхождение типа в имени файла и является неправильным. Например, doc.doxit.doc будет преобразован в .doxit

Elementary 29.08.2018 20:45

Я не вижу дополнительной буквы "r" на вашем strrpos, извините, вы правы

Charles Cavalcante 29.08.2018 21:04

Другие вопросы по теме