Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Загрузка файлов через скрипт / 4 сообщений из 4, страница 1 из 1
26.03.2020, 22:08
    #39941526
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка файлов через скрипт
Есть веб-сайт, который предоставляет доступ к файлам на веб-сервере (за пределами www-каталога) в зависимости от ряда условий.
Доступ к файлам осуществляется через скрипт getfile.php и выглядит примерно так: href="/getfile.php?owner=user1&file=file1.txt"
В скрипте, соответственно, проверяется что у пользователя user1 есть право доступа к файлу file1.txt и отдается содержимое, примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$file = "...";
if (!file_exists($file)) shutdown(404);
$type = @mime_content_type($file);
if (!$type) $type = 'application/octet-stream';
if (substr($type, 0, 12) == 'application/')
{
	header('Content-Description: File Transfer');
	header('Content-Disposition: attachment; filename="'.basename($file).'"');
}
header('Content-Type: '.$type);
header('Content-Length: ' . filesize($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($file);


В принципе данный скрипт работает более-менее приемлемо — файлы с контентом (изображения, медиафайлы, тексты) открывает в окне браузера, остальное предлагает скачать, подставляя подходящее имя файла.
Но есть небольшое пожелание.
Например если ссылка будет вести на графический файл (например getfile.php?owner=user1&file=image.jpg) и по этой ссылке пользователь выберет команду "Сохранить ссылку как...", то в диалоговом окне ему предложат сохранить файл под именем getfile.php.
Я бы хотел, чтобы и в этом случае браузер пользователя предлагал сохранить файл под правильным именем.
Сейчас, чтобы это обеспечить, я поменял схему URL, она выглядит так: getfile.php/user1/image.jpg
В этом случае браузер предлагает правильное имя для сохранения, но у меня есть некоторые причины, чтобы сохранить прежнюю схему (указывать параметры в query string).
Можно ли такое сделать? Чтобы указывать браузеру предпочитаемое имя файла, но при этом подходящие по типу файлы не загружать, а открывать в окне браузера.
Если для Content-Disposition указывать тип inline, то filename игнорируется.
...
Рейтинг: 0 / 0
26.03.2020, 23:33
    #39941533
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка файлов через скрипт
Alibek B.
Например если ссылка будет вести на графический файл
Имеется в виду картинка? Для картинки mime-type будет определено каким-нибудь вроде image/jpeg. Соответственно, оно не пройдет под проверку на равенство 'application/', а значит, скрипт не передаст заголовок Content-Disposition, где указано имя файла. Вроде, очевидно, да, что в такой ситуации браузеру просто неоткуда взять имя image.jpg для сохранения.
Alibek B.
у меня есть некоторые причины, чтобы сохранить прежнюю схему (указывать параметры в query string).
Как вариант, указать там же параметр, отвечающий за "показать" и "сохранить", и на его основе принимать решение о выдаче Content-Disposition: attachment с именем файла.
...
Рейтинг: 0 / 0
27.03.2020, 11:12
    #39941595
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка файлов через скрипт
Alibek B.

Но есть небольшое пожелание.
Например если ссылка будет вести на графический файл (например getfile.php?owner=user1&file=image.jpg) и по этой ссылке пользователь выберет команду "Сохранить ссылку как...", то в диалоговом окне ему предложат сохранить файл под именем getfile.php.
Я бы хотел, чтобы и в этом случае браузер пользователя предлагал сохранить файл под правильным именем.
Сейчас, чтобы это обеспечить, я поменял схему URL, она выглядит так: getfile.php/user1/image.jpg
В этом случае браузер предлагает правильное имя для сохранения, но у меня есть некоторые причины, чтобы сохранить прежнюю схему (указывать параметры в query string).
Можно ли такое сделать? Чтобы указывать браузеру предпочитаемое имя файла, но при этом подходящие по типу файлы не загружать, а открывать в окне браузера.
Если для Content-Disposition указывать тип inline, то filename игнорируется.
Когда вы кликаете по ссылке правой кнопкой и выбираете "Сохранить ссылку как...", браузер не шлет запросов на сервер, а предлагает имя на основе текста ссылки. Запрос будет отправлен только после нажатия на кнопку "Сохранить". Никакими заголовками в скрипте вы не сможете повлиять на выбор имени для сохранения - ваш скрипт начнет выполняться уже после того, как имя выбрано. Так что только текст url.
...
Рейтинг: 0 / 0
27.03.2020, 12:31
    #39941622
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка файлов через скрипт
Barlone
Когда вы кликаете по ссылке правой кнопкой и выбираете "Сохранить ссылку как...", браузер не шлет запросов на сервер, а предлагает имя на основе текста ссылки. ... Никакими заголовками в скрипте вы не сможете повлиять на выбор имени для сохранения

Это логично, но я как-то встречал сайт, на котором при клике предлагалось сохранение файла с заданным именем, которого в URL не было. Но я не помню, где я это встречал, чтобы просмотреть, как это сделано.
Вот и подумал, может быть в современных браузерах реализованы какие-то дополнительные заголовки.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Загрузка файлов через скрипт / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]