PHP изменить размер изображения перед сохранением в базе данных MySQL? - PullRequest
1 голос
/ 30 ноября 2010

После того, как я получил сообщение, как изменить размер на меньшую ширину (максимальная ширина 80, мин. 80) и что я должен проверить в целях безопасности?

Мой текущий код:

if(!empty($_FILES)) {
# Resize Image function
$return=true;
function resizeImage($originalImage,$toWidth,$toHeight){
    // Get the original geometry and calculate scales
    list($width, $height) = getimagesize($originalImage);
    $xscale=$width/$toWidth;
    $yscale=$height/$toHeight;

    // Recalculate new size with default ratio
    if ($yscale>$xscale){
        $new_width = round($width * (1/$yscale));
        $new_height = round($height * (1/$yscale));
    }
    else {
        $new_width = round($width * (1/$xscale));
        $new_height = round($height * (1/$xscale));
    }

    // Resize the original image
    $imageResized = imagecreatetruecolor($new_width, $new_height);
    $imageTmp     = imagecreatefromjpeg ($originalImage);
    imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

    return $imageResized;
}

// Get the file information
$userfile_name = $_FILES['profile_picture']['name'];
$userfile_tmp  = $_FILES['profile_picture']['tmp_name'];
$userfile_size = $_FILES['profile_picture']['size'];
$userfile_type = $_FILES['profile_picture']['type'];
$filename = basename($_FILES['profile_picture']['name']);
$file_ext = strtolower(substr($filename, strrpos($filename, '.') + 1));

//Only process if the file is a JPG and below the allowed limit
if((!empty($_FILES["profile_picture"])) && ($_FILES['profile_picture']['error'] == 0)) {
    $allowed_image_types = array('image/pjpeg'=>"jpg",'image/jpeg'=>"jpg",'image/jpg'=>"jpg",'image/png'=>"png",'image/x-png'=>"png",'image/gif'=>"gif");
    $allowed_image_ext = array_unique($allowed_image_types); // Do not change this
    foreach ($allowed_image_types as $mime_type => $ext) {
        if($file_ext==$ext ){
            $return=false;
            break;
        } else {
            $return=true;
        }
    }

    if ($userfile_size > (7*1048576)) { # 7 means 7 mb
        $return=false;
    }
} else {
    $return=false;
}

//Everything is ok, so we can upload the image.
if (strlen($return)==0){
    $widthAndHeight = getimagesize($userfile_tmp . "." . $file_ext); //EDITED QUESTION
    $width  = $widthAndHeight[0];
    $height = $widthAndHeight[1];

    if ($width > 80){
        $scale = 80/$width;
        $height = $height * $scale;
        $data = resizeImage($userfile_name,80,$height,$scale);
        $data = mysql_real_escape_string($data);
    } else {
        $data = mysql_real_escape_string($userfile_name);
    }

    $update = mysql_query("UPDATE `avatar` set image = '{$data}' WHERE userid = '" .  $_SESSION['userid'] . " . '");
} else {
    $return=false;
}

Тип данных в базе данных mysql - MediumBlob, поскольку он хранит только небольшой файл

Извините, что не упомянул мою проблему, код не работает. Ошибка:

Warning: getimagesize(C:\wamp\tmp\php991B.tmp.png) [function.getimagesize]: failed to open stream: No such file or directory in C:\wamp\www\XXX\avatar.php on line 82**strong text**

Ответы [ 2 ]

4 голосов
/ 30 ноября 2010

Лучше будет - сохранить изображение в файловой системе и сохранить ссылку на файл в базе данных. (Для изменения размера вы можете использовать библиотеку GD)

Попробуйте эту ссылку: http://www.php.net/manual/en/function.imagecopyresized.php

0 голосов
/ 30 ноября 2010

Если вам не нужно писать собственный код для этого, вы можете попробовать некоторые решения, которые уже существуют.

Это отличный сценарий http://phpthumb.gxdlabs.com/

Я не уверен, что вы можете сохранить данные изображения в базе данных, используя его, но в худшем случае

Вы изменяете размер изображения и сохраняете его в локальной папке используйте file_get_contents, чтобы прочитать изображение и сохранить в БД удалить временное изображение на сервере.

Но я согласен с теми, кто говорит, что вы должны хранить изображения в файловой системе, а не в базе данных.

...