Как принудительно загрузить динамическое изображение, требующее аргументов? - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть динамическое изображение, которое использует GD для добавления некоторых наложенных изображений / текста. Это будет dynamicImage.php? FirstName = Bob & lastName = Sacamano. Я хочу получить приглашение загрузить этот файл, поэтому я создал файл download.php, который будет выполнять функции посредника:

//Get the Arguments
$file .= "firstName=".filter_var($_GET['firstName'], FILTER_SANITIZE_STRING);
$file .= "&lastName=".filter_var($_GET['lastName'], FILTER_SANITIZE_STRING);

//get The File Size
$size = intval(sprintf("%u", filesize($file)));

//Header Info to Prompt for Download and name it a .jpg
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-disposition: attachment; filename=dynamicImage.jpg");
header("Content-Length: ".$size);
readfile($file, true);//.$file);

Есть 2 проблемы, сначала я получаю эту ошибку:

PHP Warning:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for dynamicImage.php?firstName=bob&amp;lastName=Sacamano in /www/download.php on line 19
PHP Warning:  readfile(dynamicImage.php?firstName=bob&amp;lastName=Sacamano) [<a href='function.readfile'>function.readfile</a>]: failed to open stream: No such file or directory in /www/download.php on line 25

Посмотрите, как он анализирует & to & amp; ? Но не только это. Если я уберу аргументы и просто оставлю dynamicImage.php, он предложит мне загрузить необработанный файл php Есть ли способ, которым я могу заставить его запустить PHP, а затем загрузить сгенерированное изображение? Кстати, мой dynamicImage.php заканчивается на:

header("Content-Type: image/JPEG");
ImageJpeg ($bg);
imagedestroy($bg);

FIXD. Я изменил мой dynamicImage.php таким образом:

if(isset($_GET['download'])){
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-image');
    header("Content-disposition: attachment; filename=dynamicImage.jpg");
}else{
    header("Content-Type: image/JPEG");    
}
ImageJpeg ($bg);
imagedestroy($bg); 

Ответы [ 4 ]

3 голосов
/ 28 сентября 2010

Я постараюсь добавить немного мяса к своему комментарию в первоначальном ответе.

Попытка загрузить ваш файл с помощью отдельного вызова другого скрипта через http - это обратная задача, которая усложняет простую проблему.

Было бы проще выполнить рефакторинг исходного кода для dynamicImage.php в функцию.Затем включите этот файл в качестве библиотеки в download.php и используйте функцию из dynamicImage.php, чтобы вернуть ваше изображение с установленным заголовком Content-disposition.

Или вы можете добавить загрузку в качестве третьего аргумента в свой dynamicImage.phpсценария и просто добавьте заголовок Content-Disposition в форму вывода dynamicImage.php, когда этот аргумент установлен.

Также см. ответ @ Новикова.

0 голосов
/ 28 сентября 2010

Я думаю, у вас есть только 2 решения:

  1. Создайте изображение в первый раз с помощью dynamicImage.php и сохраните его на своем сервере, например, bob-Sacamano.jpg . Но это будет пожиратель жесткого диска, если у вас будет много изображений для генерации, тем не менее, это решение.
  2. Как сказал Новиков и многие другие, вы можете сгенерировать и принудительно загрузить в том же сценарии. (Может быть, с другим аргументом в вашем вызове get http, как предложено).
0 голосов
/ 28 сентября 2010

Вы пытаетесь вызвать скрипт PHP из скрипта PHP через HTTP? Very Rube Goldbergy.

  1. Возможно, вам понадобится полный путь, например http://yoursite/dynamicImage.php,, в противном случае функции обработки файлов PHP будут обрабатывать его как вызов файловой системы, а не как вызов оболочки HTTP.
  2. В руководстве по PHP указано, что stat не поддерживается в оболочках HTTP, поэтому вы не сможете выполнить filesize("http://url").

Я бы предложил рефакторинг кода в dynamicImage.php, чтобы, например, & action = download позволило вам загрузить изображение в виде файла, а не в формате JPEG.

0 голосов
/ 28 сентября 2010

Как файл называется на вашем жестком диске?Это значение, на которое вы должны указать filesize ().

...