imagejpeg () не дает вывод правильно в php - PullRequest
2 голосов
/ 23 июня 2010

Я хочу загрузить изображение с диска, изменить его размер, , а затем загрузить его в Amazon S3.

Однако я не могу получить правильный вывод изображения из imagejpeg ().

вот мой код:

$sourceUrl = $_FILES['path']['tmp_name'];       
$thumbWidth = '100';
$thumbid = uniqid();
$img = imagecreatefromjpeg($sourceUrl);
$width = imagesx( $img );
$height = imagesy( $img );

// calculate thumbnail size
$new_width = $thumbWidth;
$new_height = floor( $height * ( $thumbWidth / $width ) );

// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );

// copy and resize old image into new image
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// output the image 
imagejpeg($tmp_img);

// upload thumbnail to s3
$s3->putObjectFile($tmp_img, "mybucket", $thumbid, S3::ACL_PUBLIC_READ);

Firebug выдает мне эту ошибку:

illegal character
[Break on this error] (�����JFIF���������>CREATOR: g...(using IJG JPEG v62), default quality\n

Если я изменю imagejpeg таким образом,

imagejpeg($tmp_img, 'abc.jpg');

тогда я получаю ту же ошибку. (

Могу ли я получить помощь здесь, пожалуйста?

Ответы [ 4 ]

3 голосов
/ 23 июня 2010

Если вы проверяете документацию imagejpeg, вы можете видеть, что выводит изображение, оно означает, как вы его называете, оно отправляется в браузер. Вы можете сохранить его в файл вторым способом, как вы его называете, передавая имя файла во втором параметре.

Кроме того, $tmp_img - это ресурс изображения, а не готовый файл изображения.

Я не знаю, как работает ваша функция загрузки, но: если вам нужно *1000* содержимое файла для загрузки, сделайте это так:

ob_start();
imagejpeg($tmp_image);
$image_contents = ob_get_clean();
$s3->putObjectFile($image_contents, "mybucket", $thumbid, S3::ACL_PUBLIC_READ);

если вам нужно имя файла для загрузки:

$filename = tempnam(sys_get_temp_dir(), "foo");
imagejpeg($tmp_image, $filename);
$s3->putObjectFile($filename, "mybucket", $thumbid, S3::ACL_PUBLIC_READ);
0 голосов
/ 24 июня 2010

Ну, ребята, большое спасибо еще раз, я немного обошелся и, сочетая это с вашими ответами, получил следующее:)

$thumbid .= ".jpg";
$img = imagecreatefromgif($sourceUrl);
$width = imagesx( $img );
$height = imagesy( $img );

// calculate thumbnail size
$new_width = $thumbWidth;
$new_height = floor( $height * ( $thumbWidth / $width ) );

// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );

// copy and resize old image into new image
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

$path = '/var/www/1.4/wwwroot/cdn/'.$thumbid;
// output the image 
if(imagegif($tmp_img, $path)){                  
    $thumblink = "";
    // upload thumbnail to s3
    if($s3->putObjectFile($path, "mybucket", $thumbid, S3::ACL_PUBLIC_READ)){
        $thumblink = "http://dtzhqabcdscm.cloudfront.net/".$thumbid;
        imagedestroy($tmp_img);
    }
    return $thumblink;
}
0 голосов
/ 23 июня 2010

1) $tmp_img - это ресурс, а не файл.Вам, вероятно, нужно сохранить изображение на диск и использовать его для putObjectFile

2) Вам, вероятно, нужно сообщить S3, что загружаемый файл имеет тип image / jpeg

0 голосов
/ 23 июня 2010

Вы должны определить заголовок:

header('Content-type: image/jpeg');
...