Динамическое переименование файлов JPEG в процессе их отображения пользователям - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь динамически переименовать файл изображения JPEG, как он отображается для пользователя.

У меня есть файл image_generate.php со следующим кодом:

$file = $_GET['file'];
$imagepath = "path/to/image.jpg";
$image = imagecreatefromjpeg($imagepath);
header('Content-Type: image/jpeg');

$filename = "[site.com]_some_image_name_here";
header('Content-Disposition: attachment; filename="' . $filename . '.jpg"');

imagejpeg($image, NULL, 100);
imagedestroy($image); // Free up memory

И этовызывается тегом html-изображения следующим образом:

<img src="image_generate.php?file=imagenamehere" />

Пока что вывод имеет следующие результаты:

  • Когда я щелкаю правой кнопкой мыши на изображении и нажимаю «Просмотр»Изображение, «появляется диалоговое окно загрузки и спрашивает, хочу ли я сохранить файл» [site.com] _some_image_name_here.jpg "(я хочу, чтобы это произошло)
  • Если я щелкну правой кнопкой мыши на изображениеи нажмите «Сохранить изображение как» или «Сохранить изображение», имя файла, который необходимо сохранить, будет отображаться как исходное имя файла (независимо от того, какую переменную $ file удалось извлечь).

Как можноЯ исправлю вторую часть?Я хочу изменить имя файла изображения, даже когда пользователь нажимает «Сохранить изображение как» или «Сохранить изображение».

Я пытался изменить код следующим образом:

...

$rename = $filename . ".jpg";
imagejpeg($image, $rename, 100);
imagedestroy($image); // Free up memory

Но изображение не отображается на странице с тегом html (отображается как разорванное изображение).Я не очень знаком с заголовками HTML и Content-Dispositions.Я предполагаю, что там где-то есть ошибка ..?Есть идеи?

Спасибо за чтение!

Редактировать: .htaccess ниже

<IfModule mod_rewrite.c>

RewriteEngine On

# Sends image download request to image_generate.php for parsing
RewriteRule ^path/from/img/tag/downloads/(.*).jpg$ path/to/image_generate.php?file=$1 [NC,L]
RewriteRule ^path/to/image_generate.php$ /home/path/to/image_generate.php [NC,L]

</IfModule>

1 Ответ

3 голосов
/ 08 марта 2011

Разные браузеры будут работать по-разному.

Например, Internet Explorer не пытается извлечь какую-либо информацию заголовка перед отображением диалогового окна сохранения файла при выполнении Right Click > Save Image As (он автоматически предполагает, что вы хотите сохранить результат запроса, независимо от того, каков результат) , Ни один не делает Firefox. Следовательно, для IE и Firefox будет невозможно указать имя файла, указав его в заголовках.

Более элегантный и совместимый с UA способ сделать это - использовать Apache mod_rewrite для перезаписи URL. Перезапись URL-адреса позволяет перенаправить запрос на один URL-адрес на другой.

Чтобы настроить это, вам нужно создать файл .htaccess в каталоге, где расположен image_generate.php, содержащий следующее:

RewriteEngine On
RewriteRule ^generated/([a-z0-9-]+)\.jpg$  generated_image.php?file=$1  [L]

Затем просто измените свой HTML, чтобы он указывал на переписанный URL.

<img src="generated/imagenamehere.jpg" />

Это также дает преимущество, заключающееся в том, что создание вашего изображения полностью прозрачно для пользователя (с точки зрения URL оно выглядит просто как статичное изображение).

Более подробную информацию о mod_rewrite можно найти здесь:

...