Как загрузить файл с его оригинальным именем вместо уникального имени?

#php #filenames

#php #имена файлов

Вопрос:

В настоящее время мой прогресс загрузки файла следующий:

  1. Пользователь выбирает файл для загрузки.
  2. Затем я переименовываю загруженный пользователем файл в уникальное имя следующим PHP-кодом:
     $ext = explode('.', basename( $_FILES['file1']['name']));
    $file_name1 = md5(uniqid()) . "." . $ext[count($ext)-1]; 
     
  3. После этого я просто загружаю этот уникальный файл в свой каталог ‘upload_doc /’.

Теперь в моем скрипте есть опция для загрузки этого загруженного файла. Для загрузки я просто вызываю это unique имя файла из каталога ‘updload_doc /’ и загружаю его.

Теперь при загрузке файла отображается мое восстановленное имя файла.

Есть ли какой-либо способ загрузить этот файл с его оригинальным именем вместо unique имени файла?

Примечание: я могу загрузить исходный файл в каталог, но что произойдет, если пользователь загрузит тот же файл? Можете ли вы, ребята, рассказать, в чем хитрость для этого?

Моя система загрузки файлов :

Это кнопка для загрузки:

 <a target="_self" href="download.php?filename=<?php echo $rselectfile1['file_name']; ?>"><input type="button" name="download" value="Download" class="submit"/></a>
 

Это download.php файл

 <?php
@session_start();
//require_once("config.php");
if(!isset($_SESSION['front_username']) amp;amp; isset($_SESSION['front_username']) == "" amp;amp;
    !isset($_SESSION['front_password']) amp;amp; isset($_SESSION['front_password']) == "" amp;amp;
     !isset($_SESSION['user_id']) amp;amp; isset($_SESSION['user_id']) == "") {
    header("Location:login.php");   
    exit();
}


$file_get = $_GET['filename'];

$tmp = explode(".",$file_get);
switch ($tmp[count($tmp)-1]) {
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "docx":
  case "doc": $ctype="application/msword"; break;
  case "csv":
  case "xls":
  case "xlsx": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  case "tif":
  case "tiff": $ctype="image/tiff"; break;
  case "psd": $ctype="image/psd"; break;
  case "bmp": $ctype="image/bmp"; break;
  case "ico": $ctype="image/vnd.microsoft.icon"; break;
  default: $ctype="application/force-download";
}

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename="".$file_get."";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile("upload_doc/$file_get" );


?>
 

Комментарии:

1. Конечно, просто установите переменную для имени, прежде чем переименовывать его.

2. @Fred-ii- Я не понимаю.

3. $filename = $_FILES["uploaded_file"]["name"]; согласно developphp.com/page.php?id=449

4. Что @Fred-ii- сказал, но вам придется его где-то отслеживать. Кроме того, вы можете включить оригинальное имя как часть уникального имени, но с разделителем, что упрощает повторный анализ.

5. @TecBrat Нет, я не хочу смешивать его с оригинальным и уникальным идентификатором.

Ответ №1:

Я бы просто добавил к имени файла хэш вместо его замены. Таким образом, оригинальное имя файла сохраняется. Итак, ваш код будет выглядеть так:

 $file_name1 = md5(uniqid()) . '-' . $_FILES['file1']['name'];
// Example: b4b34d95b44ea3ebaa125508fd51dd44-image.jpg
 

При загрузке вы можете просто удалить этот хэш из имени файла:

 $file_name1 = substr($file_name1, 33);
// Example: image.jpg
 

А затем задайте имя файла, например:

 header('Content-Disposition: attachment; filename="' . $file_name1 . '"');
 

Комментарии:

1. О, ты был на 13 секунд быстрее 🙂

2. @Gergo Erdosi Это может быть трюк, но теперь уверен, работает он или нет. Я пытаюсь это сделать.

3. Я не думаю, что это хорошая идея сохранить исходное имя файла. Одна из основных причин переименования загруженных файлов — убедиться, что имя файла не содержит «плохих» символов. Я настоятельно рекомендую использовать DB для хранения оригинальных имен файлов.

4. Тогда есть ли какие-либо проблемы, если есть файл с именем «image.jpg — дважды ?

5. Что? Что вы имеете в виду?

Ответ №2:

Это просто. Просто сохраните как оригинальные, так и уникальные имена файлов в БД, когда файл будет загружен, а затем в скрипте загрузки выберите строку из базы данных, используя уникальное имя файла, и установите его имя на исходное имя.

Исходное имя файла сохраняется в его переменной в скрипте загрузки:

 $_FILES['file_input_tag_name']['name']
 

Чтобы задать пользовательское имя загружаемого файла, просто установите правильное поле заголовка:

 header('Content-Disposition: attachment; filename="' . $original_filename . '"');
 

Комментарии:

1. Проверьте мой обновленный вопрос. Я загрузил свой скрипт. Вы сказали получить исходное имя файла при загрузке. Но мой файл сохраняется в каталоге с уникальным именем, тогда как я могу получить исходное имя файла?

2. У вас есть исходное имя $_FILES['file1']['name']) файла, вы уже работаете с ним (вы извлекаете расширение файла).

3. Также @Fred-ii — упомянул об этом в комментарии к вашему вопросу 2 дня назад.