0

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

看看它如何将 & 解析为 & ? 但不仅如此。如果我取出参数并离开 dynamicImage.php,它会提示我下载原始 php 文件。有没有办法让它运行 PHP 然后下载生成的图像?顺便说一句,我的 dynamicImage.php 以:

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

固定。我因此改变了我的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

4 回答 4

3

在最初的回答中,我会尝试在我的评论中添加一些内容。

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

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

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

另请参阅@Novikov 的回答。

于 2010-09-28T07:22:05.097 回答
0

你硬盘上的文件是怎么调用的?这就是您应该使用 filesize() 的值。

于 2010-09-28T07:06:45.727 回答
0

我认为您只有两个解决方案:

  1. 第一次使用您的 dynamicImage.php 生成图片并将其存储到您的服务器中,例如bob-Sacamano.jpg。但是,如果您要生成大量图片,它将成为硬盘空间吞噬者,但这仍然是一个解决方案。
  2. 正如 Novikov 和其他许多人所说,您可能希望在同一个脚本中生成和强制下载。(也许在你的 get http 调用中有另一个参数,就像建议的那样)。
于 2010-09-28T09:00:46.943 回答
0

您正在尝试通过 HTTP 从 PHP 脚本中调用 PHP 脚本?非常鲁布·戈德伯格。

  1. 您可能需要一个完整的路径,例如http://yoursite/dynamicImage.php,否则 PHP 文件处理函数会将其视为文件系统调用而不是 HTTP 包装器调用。
  2. PHP手册指出 HTTP 包装器不支持 stat ,因此您将无法执行filesize("http://url").

我建议重构 dynamicImage.php 中的代码,例如 &action=download 将让您将图像下载为文件而不是 jpeg。

于 2010-09-28T07:12:46.023 回答