#php
#php
Вопрос:
Мой код выглядит следующим образом:
$final_img = ''; //some image manipulations
header('Content-Description: File Transfer');
header('Content-Type: application/octet-image');
header("Content-disposition: attachment; filename=tests.png");
imagepng($final_img);
Мой вопрос в том, что когда люди нажимают на якорь, он автоматически сохраняет изображение с именем tests.png. Но если пользователь щелкнет правой кнопкой мыши и сохранит ссылку как, они могут сохранить файл под любым именем, которое они хотят. Итак, как я могу вызвать диалоговое окно сохранения как, когда люди нажимают на ссылку?
Комментарии:
1. Не существует такой вещи, как
application/octet-image
. Вы хотитеapplication/octet-stream
. Или даже лучшеimage/png
(да, вы можете и должны это делать, даже если файл сохраняется на диске).2. это работает, хотя, когда я использовал octed-image, хотя я изменю его на octet-stream.
3. 1, этот вопрос действителен и поэтому недооценен. @Henson, почему бы не использовать image / png в качестве mime-типа? Он был определен для этого…
4. @PelletenCate : спасибо за совет, но это всего лишь пример, я могу сгенерировать jpg, gif или png позже.
5. @Henson Ну, для этой цели также есть image / jpeg и image / gif. Лучше всего быть как можно более конкретным в вашем типе содержимого. (Не так сложно написать для него несколько условных строк, не так ли?) В противном случае application / octet-stream — это действительно правильный путь.
Ответ №1:
Вероятно, для настроек загрузки пользователя установлено значение «по умолчанию для местоположения X». Вы не можете это контролировать. Позвольте пользователю делать с файлом то, что он хочет, и прекратите попытки вмешиваться в его / ее рабочий процесс.
Комментарии:
1. Однако у вас есть некоторый контроль над именем файла, если пользователь отправляет его на сервер вместе с запросом на загрузку. См. Ответ.
2. @PelletenCate: не путь. Попытка заново изобрести поведение браузера является «неправильным».
3. Верно, хотя вопрос подразумевал, что имя файла является предметом. Этический взгляд на это решение является спорным и, на мой взгляд, сильно зависит от варианта использования. Я думаю, что еще немного рано называть это «неправильным».
4. На самом деле меня не волнует путь, только имя файла.
5. @Henson: Ваш пользователь заботится о пути. Почему вы так мало заботитесь о том, что волнует вашего пользователя? Ваш пользователь важнее вас … и вы загружаете на компьютер вашего пользователя.
Ответ №2:
Вы не можете. Это зависит от настроек браузера пользователя.
Ответ №3:
Вы не можете делать то, что просите, так, как вы предлагаете. Однако вы можете явно запросить у пользователя имя файла, используя это:
<form action="download.php" method="get">
<label>File name:</label>
<input type="text" name="filename" />
<input type="submit" name="submit" value="Download image" />
</form>
download.php:
$final_img = ''; //some image manipulations
/* Fetch filename and ensure it ends with '.png'. */
/* @todo strip unacceptable characters, e.g. slashes etc. */
$fileName = trim($_GET['filename']);
if (strtolower(substr($fileName,-4)) != '.png') $fileName .= '.png'
/* Send the headers */
header('Content-Description: File Transfer');
header('Content-Type: image/png');
header("Content-disposition: attachment; filename=$fileName");
/* Send the image data */
imagepng($final_img);
Комментарии:
1. конечно, хотя довольно странно использовать форму, чтобы попросить пользователя ввести, каким будет его имя файла. Я просто подумал: «Если это не сломано, не исправляйте это», потому что общий процесс загрузки — это щелчок, мы выбираем, где мы хотим сохранить, каково имя, и нажимаем Сохранить. Думаю, браузеры позаботятся об этом сейчас
2. Что ж, если браузер автоматически сохраняет файл, что меняется в этом потоке? Мы выбираем имя файла, нажимаем кнопку «Сохранить» (в этом примере я назвал ее «загрузить файл»), и браузер делает все остальное за нашими спинами. Мы просто не можем выбирать путь…
3. да, я имею в виду, что использование формы, а не простого якоря для загрузки (IMO), просто немного странно для пользовательского интерфейса. Однако при использовании менеджера загрузок нам предлагается изменить имя файла, так что, я думаю, это так.
4. Ну, насколько важен пользовательский интерфейс, конечно, вам не нужно, чтобы он выглядел как форма… Вы также можете добавить тег привязки вместо кнопки отправки и отправить форму с помощью javascript. (Я делаю это все время.). Или даже вообще не отправлять форму, а просто выполнить a
window.location
с именем файла, добавленным в строку запроса. Моя точка зрения такова: на мой взгляд, презентация не должна строго подразумевать определенную реализацию. Вы даже можете сделать так, чтобы оно выглядело полностью как окно «сохранить как», хотя у вас нет реального списка файлов.