Amazon S3 Качете PDF и създайте изображение на корицата

Имам следния код, който качва PDF в Amazon S3, това, което трябва да направя, е да създам изображение от първата страница на PDF файла и да го кача и в s3.

//instantiate the class
$s3 = new S3(awsAccessKey, awsSecretKey);

//check whether a form was submitted
if($_SERVER['REQUEST_METHOD'] == "POST")
{
    //retreive post variables
    $fileName = $_FILES['file']['name'];
    $fileTempName = $_FILES['file']['tmp_name'];
    $fileSize = $_FILES['file']['size'];

    $extension=end(explode(".", $fileName));
    $rand = rand(1,100000000);
    $sha1 = sha1($rand);
    $md5 = md5($sha1);
    $fName = substr($md5, 0, 20);       
    $finalName = $fName.'.'.$extension;

    //create a new bucket
    $s3->putBucket("bucket", S3::ACL_PUBLIC_READ);

    //move the file
    if ($s3->putObjectFile($fileTempName, "bucket", 'publications/'.$finalName, S3::ACL_PUBLIC_READ)) {
        $s3file='http://bucket.s3.amazonaws.com/publications/'.$finalName;
        $aS3File = 'publications/'.$finalName;

        $im = new imagick($s3file[0]); 
        // convert to jpg 
        $im->setImageColorspace(255); 
        $im->setCompression(Imagick::COMPRESSION_JPEG); 
        $im->setCompressionQuality(75); 
        $im->setImageFormat('jpeg'); 
        //resize 
        $im->resizeImage(640, 877, imagick::FILTER_LANCZOS, 1);  
        //write image on server (line 54) 
        $s3->putObjectFile("","bucket", 'publications/'.$im->writeImage($fName.'.jpg'), S£::ACL_PUBLIC_READ);

    }else{
        echo "<strong>Something went wrong while uploading your file... sorry.</strong>";
    }

Замених действителното си име на кофа с „кофа“ за сигурност, може ли някой да ми каже какво правя грешно тук, тъй като получавам следната грешка:

PHP Фатална грешка: Неуловено изключение „ImagickException“ със съобщение „Не може да се прочете файлът: h“ в /var/www/ams/pub-new-issue.php:45\nПроследяване на стека:\n#0 /var/www/ ams/pub-new-issue.php(45): Imagick->__construct('h')\n#1 {main}\n хвърлен в /var/www/ams/pub-new-issue.php на ред 45 ,

Благодаря


person Justin Erswell    schedule 23.05.2013    source източник


Отговори (1)


$s3file='http://bucket.s3.amazonaws.com/publications/'.$finalName;
$im = new imagick($s3file[0]); 

$s3file е низ, но имате достъп до индекс на масив в него. В резултат на това извличате първия знак, h. Използвайте само $s3file във вашата инстанция на Imagick и трябва да сте добре.

person ceejayoz    schedule 23.05.2013
comment
направих както казахте тук, но получих следната грешка Uncaught exception 'ImagickException' със съобщение 'unable to open image `/var/www/ams/d4cf8f3e33c27055fcb3.jpg': @ error/blob.c/OpenBlob/2587' в /var/www/ams/pub-new-issue.php:54\nПроследяване на стека:\n#0 /var/www/ams/pub-new-issue.php(54): Imagick-›writeimage('d4cf8f3e33c2705. ..')\n#1 {main}\n хвърлен в /var/www/ams/pub-new-issue.php на ред 54 - person Justin Erswell; 23.05.2013
comment
/var/www/ams/d4cf8f3e33c27055fcb3.jpg съществува ли? Достъпен ли е от потребителя на уеб сървъра? Откъде все пак идва този път? $s3file трябва да бъде http://bucket.s3.amazonaws.com/publications/... според вашия код. - person ceejayoz; 23.05.2013
comment
/var/www/ams е главната папка на това приложение и следователно бих предположил, че е достъпно. Изпуснах само [0], както предложихте, така че не съм сигурен откъде се получава това? - person Justin Erswell; 23.05.2013
comment
Трудно е да се каже, тъй като сте премахнали част от кода от примера, така че да знаете кой ред е #54 е трудно. $im->writeImage($fName.'.jpg') ред ли е? Ако е така, вашият уеб сървър вероятно няма разрешения да запише изображението на това място. Вероятно трябва да пишете във временен файл. - person ceejayoz; 23.05.2013
comment
ред 54 е $s3-›putObjectFile(,bucket, 'publications/'.$im-›writeImage($fName.'.jpg'), S£::ACL_PUBLIC_READ); - person Justin Erswell; 23.05.2013
comment
Добре, значи вашият уеб сървър не може да записва в обекта Imagick на /var/www/ams. Опитайте да го поставите в /tmp или нещо подобно. - person ceejayoz; 23.05.2013
comment
Съжалявам, но това не ми помага, не се опитвам да съхранявам това изображение локално, а го запазвам в Amazon S3. Има ли нещо в тази оригинална парадигма, което мога да направя, за да разреша това. - person Justin Erswell; 23.05.2013
comment
Вашият код $im->writeImage съхранява изображението локално. Ако не се опитвате да го съхранявате локално, спрете да се опитвате да го съхранявате локално. - person ceejayoz; 23.05.2013