[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подмена (переименование) файла при скачивании PHP
Страницы: 1, 2
techno77
Добрый день, знатоки!

Встал вопрос, который решить самому или найти готовое решение не получилось. Впервые за 12 лет.

Бывает.

Задача: На сайте генерируются документы с именем вида ee81eb04c5d0a300e708084c0785e3b0.docx

В базе у файла есть красивое имя, например "Договор поставки с ООО Василек".

Как сделать так, чтобы когда человек нажимает скачать файл, ему скачивался не ee81eb04c5d0a300e708084c0785e3b0.docx, а Договор_поставки_с_ООО_Василек.docx?

Вот суть. Есть идеи?
vagrand
techno77
Ссылки на файлы прямые или через скрипт?

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
techno77
Цитата (vagrand @ 24.02.2014 - 18:24)
techno77
Ссылки на файлы прямые или через скрипт?

Ссылки прямые.
vagrand
techno77
В таком случае могу порекомендовать только делать симлинки на файлы с красивыми именами, ну или отдавать через скрипт и там отсылать название файла в заголовке. Альтернативы с использованием каких-то модулей вебсервера скорее всего есть, но там 100% будет труднее реализовать да и не факт что на хостинге будет работать.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
sergeiss
Цитата (vagrand @ 24.02.2014 - 19:04)
ну или отдавать через скрипт и там отсылать название файла в заголовке.

Мне вот такой вариант больше нравится smile.gif
Мало того, что мы можем отдать красивое имя, так еще и можем контролировать время работы скрипта (например, ограничить продолжительность работы такой ссылки: 1 день, неделя...); также можно отдать данные только зарегенному юзеру, если это требуется по логике работы сайта. Плюс к этому, такой вариант будет 100% рабочий и под виндовым сервером, и под юниксовым.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
techno77
Вот окончательное решение.


<a href="download.php?filename=/download/file.docx&cleanname=Новое имя файла.docx">Скачайте</a>


download.php

<?php
$HOME = $_SERVER['DOCUMENT_ROOT'];

$sourceFile = $_GET['filename'];
$cleanFilename = $_GET['cleanname'];

if( headers_sent() )
die('Headers Sent');

if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');

if (!is_file($HOME.$sourceFile)) { die("<b>404 File not found!</b>"); }

$len = filesize($HOME.$sourceFile);
$filename = basename($HOME.$sourceFile);
$file_extension = strtolower(substr(strrchr($filename,"."),1));

switch( $file_extension ) {
case "pdf" : $ctype="application/pdf"; break;
case "exe" : $ctype="application/octet-stream"; break;
case "zip" : $ctype="application/zip"; break;
case "doc" : $ctype="application/msword"; break;
case "xls" : $ctype="application/vnd.ms-excel"; break;
case "ppt" : $ctype="application/vnd.ms-powerpoint"; break;
case ".docx": $ctype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"; break;
case ".pptx": $ctype="application/vnd.openxmlformats-officedocument.presentationml.presentation"; break;
case ".xlsx": $ctype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; break;
case "gif" : $ctype="image/gif"; break;
case "png" : $ctype="image/png"; break;
case "jpeg" :
case "jpg" : $ctype="image/jpg"; break;
case "mp3" : $ctype="audio/mpeg"; break;
case "wav" : $ctype="audio/x-wav"; break;
case "mpeg" :
case "mpg" :
case "mpe" : $ctype="video/mpeg"; break;
case "mov" : $ctype="video/quicktime"; break;
case "avi" : $ctype="video/x-msvideo"; break;

//The following are for extensions that shouldn't be downloaded
case "php" :
case "css" :
case "js" :
case "htm" :
case "html" :
case "txt" : die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

default : $ctype="application/force-download";
}

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
$header="Content-Disposition: attachment; filename=\"".basename($cleanFilename)."\";";
header($header );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$len);
@readfile($HOME.$sourceFile);
exit;

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.