#php #filenames
#php #имена файлов
Вопрос:
В настоящее время мой прогресс загрузки файла следующий:
- Пользователь выбирает файл для загрузки.
- Затем я переименовываю загруженный пользователем файл в уникальное имя следующим PHP-кодом:
$ext = explode('.', basename( $_FILES['file1']['name'])); $file_name1 = md5(uniqid()) . "." . $ext[count($ext)-1];
- После этого я просто загружаю этот уникальный файл в свой каталог ‘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=4494. Что @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 дня назад.