如何强制下载需要参数的动态图像?

时间:2010-09-28 07:01:53

标签: php header gd readfile

我有一个动态图像,它使用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);

有两个问题,首先我收到此错误:

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

了解它如何解析&amp;到&amp; amp; ?但不仅如此。如果我取出参数并离开dynamicImage.php,它会提示我下载原始的php文件。有没有办法让它运行PHP然后下载生成的图像? BTW我的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 个答案:

答案 0 :(得分:3)

我会尝试在初步回答中添加一些评论。

尝试通过http单独调用另一个脚本来下载文件是倒退的,并且使一个简单的问题复杂化。

将dynamicImage.php的原始代码重构为函数会更容易。然后将该文件作为library.php中的库包含在内,并使用dynamicImage.php中的函数返回带有Content-disposition标头集的图像。

或者您可以将下载作为第三个参数添加到dynamicImage.php脚本中,并在设置该参数时将Content-Disposition标头添加到输出格式dynamicImage.php。

另见@ Novikov的回答。

答案 1 :(得分:0)

如何在硬盘上调用文件?这是你应该文件化()的价值。

答案 2 :(得分:0)

您是否试图通过HTTP从PHP脚本中调用PHP脚本?非常Rube Goldbergy。

  1. 您可能需要一个完整的路径,例如http://yoursite/dynamicImage.php,否则PHP文件处理函数会将其视为文件系统调用,而不是HTTP包装器调用。
  2. PHP manual声明HTTP包装器不支持stat,因此您将无法执行filesize("http://url")
  3. 我建议在dynamicImage.php中重构代码,以便例如&amp; action = download可以让你将图像下载为文件而不是jpeg。

答案 3 :(得分:0)

我认为你只有2个解决方案:

  1. 第一次使用dynamicImage.php生成图片并将其存储到服务器中,例如 bob-Sacamano.jpg 。但是,如果你有很多照片可以生成它,它将是一个硬盘空间食物,但它仍然是一个解决方案。
  2. 正如Novikov和其他许多人所说,您可能希望在同一个脚本中生成并强制下载。 (也许在你的获取http调用中使用另一个参数,如建议的那样)。