PHP调整了图像功能和S3上传功能 - 但如何合并两者?

时间:2011-02-12 19:10:15

标签: php amazon-s3

我正在使用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)

2 个答案:

答案 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函数从临时目录中删除该文件。