我正在为我们当地的童子军写一个简单的网站,它应该允许上传图片。我使用PHP 4.3.9来调整图像大小并创建缩略图,但是(捐赠的)托管服务不允许从PHP写文件系统。但是,他们确实提供了mysql的5G。我想。将图像存储在数据库中,但还没有找到将调整大小的图像转换为JPEG的方法。据我所知,imagejpg只会写入一个文件(我不能这样做)。做有人知道是否有可能在PHP中生成JPEG内存?谢谢!吉姆
可以使用输出缓冲:
ob_start();
imagejpeg($image, NULL, 100);
$image_data = ob_get_contents();
ob_end_clean();
澄清一下,如果您查看imagejpeg的手册,您将看到可以使用它直接写入文件或输出原始图像流,具体取决于第二个参数。我正在使用输出缓冲来捕获原始图像流。
我推荐jeroen的输出缓冲解决方案,但我将添加这个作为一个很酷的替代方案。
从这里使用类http://www.php.net/manual/en/stream.streamwrapper.example - 1. - php
class VariableStream {
var $position;
var $varname;
function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path);
$this->varname = $url["host"];
$this->position = 0;
return true;
}
function stream_read($count)
{
$ret = substr($GLOBALS[$this->varname], $this->position, $count);
$this->position += strlen($ret);
return $ret;
}
function stream_write($data)
{
$left = substr($GLOBALS[$this->varname], 0, $this->position);
$right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
$GLOBALS[$this->varname] = $left . $data . $right;
$this->position += strlen($data);
return strlen($data);
}
function stream_tell()
{
return $this->position;
}
function stream_eof()
{
return $this->position >= strlen($GLOBALS[$this->varname]);
}
function stream_seek($offset, $whence)
{
switch ($whence) {
case SEEK_SET:
if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
$this->position = $offset;
return true;
} else {
return false;
}
break;
case SEEK_CUR:
if ($offset >= 0) {
$this->position += $offset;
return true;
} else {
return false;
}
break;
case SEEK_END:
if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
$this->position = strlen($GLOBALS[$this->varname]) + $offset;
return true;
} else {
return false;
}
break;
default:
return false;
}
}
function stream_metadata($path, $option, $var)
{
if($option == STREAM_META_TOUCH) {
$url = parse_url($path);
$varname = $url["host"];
if(!isset($GLOBALS[$varname])) {
$GLOBALS[$varname] = '';
}
return true;
}
return false;
}
}
那么你可以直接写
stream_wrapper_register("var", "VariableStream")
or die("Failed to register protocol");
$GLOBALS['binaryImageContent'] = '';
imagejpg($im, 'var://binaryImageContent');
$data = $GLOBALS['binaryImageContent'];
echo strlen($data);
您可以"生成到内存",但我不知道您打算如何存储图像以供以后检索。如果您计划在每次有人加载页面时都调整图像的大小,那么您将消耗大量CPU时间。由于没有直接写入磁盘的选项(真的吗?),我建议您至少将映像作为BLOB存储在MySQL数据库中。虽然这是低效的,也不是好的做法,但它仍然比每次刷新页面时重复做同样的工作要好。
更一般地说,我建议抛弃"捐赠的"提供者,获得一个真正的web服务。几乎每个网络托管公司都提供一些MySQL和PHP的版本。对于少量使用的共享主机,你可以每月支付10 - 20美元。PHP 4.3.9于2004年发布。要找到适合那个特定版本的好文档是很困难的,而且你不能忽视自那以后修复的错误数量。