我正在使用S3存储图像,我在使用PHP上传之前调整图像大小并进行压缩。我正在使用此类将图像存储到S3存储桶 - http://undesigned.org.za/2007/10/22/amazon-s3-php-class
如果我在上传文件之前没有进行任何文件处理,这一切都正常,因为它从$ _FILES数组中读取文件上传。
问题是我在存储到S3存储桶之前调整大小并压缩图像。所以我再也无法从$ _FILES数组中读取。
调整大小的功能:
public function resizeImage($newWidth, $newHeight, $option="auto")
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
我在调整大小并压缩到本地目录后用于存储文件的脚本:
public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}
使用此PHP代码调用它:
$resizeObj = new resize("$images_dir/$filename");
$resizeObj -> resizeImage($thumbnail_width, $thumbnail_height, 'crop');
$resizeObj -> saveImage($images_dir."/tb_".$filename, 90);
如何修改上面的代码,以便我可以通过此函数传递:
$s3->putObjectFile($thefile, "s3bucket", $s3directory, S3::ACL_PUBLIC_READ)
答案 0 :(得分:1)
我不明白你对$_FILES
变量的意思。如果您在编辑后将上传的文件移动到本地路径,$_FILES
对您来说将不再有用。
根据我对这个问题的理解,我会创建一个新函数putImageToServer
:
public function putImageToServer($path, $imageQuality) {
saveImage($path, $imageQuality);
$s3->putObjectFile($path, "s3bucket", $s3directory, S3::ACL_PUBLIC_READ)
// Now, if you don't want the file to be on your local directory,
unlink($path);
}
但是,您应该使$s3directory
成为常量或实例变量,以便新方法可以使用该变量。
如果这不是您正在寻找的答案,我很抱歉,我试图根据我对该问题的理解来回答。
答案 1 :(得分:0)
使用复制PHP函数保存到临时目录,然后使用S3函数从目录中读取。 S3上载完成后,使用unlink函数从临时目录中删除该文件。