Загрузка изображения в базе данных MYSQL не работает - PullRequest
0 голосов
/ 16 февраля 2019

Я прочитал множество статей о stackoverflow и google, касающихся загрузки файлов и отображения непосредственно в / из столбца BLOB MYSQL.Мне не нужно загружать файл куда-либо, потому что в моем полном проекте задействован только один файл - это файл логотипа, который должен обновлять пользователь.Хотя я хотел сделать это с библиотекой Codeigniter Upload, но я не смог завершить код, поэтому я пробовал простое PHP-решение, но оно тоже не сработало.

Ниже приведен мой код.

Код для формы загрузки:

<?php echo form_open_multipart('UpdateCompanyInfo'); ?>
        <div class="form-group">
            <label>Logo</label>
            <input type="file" class="form-control" name="logo">
            [200 px (width)x200px (height)]
        </div>
    <div class="box-footer">
        <button type="submit" class="btn btn-primary">Update Logo</button>
    </div>
<?php echo form_close(); ?>

Код для загрузки:

$check = getimagesize($_FILES["logo"]["tmp_name"]);
if($check !== false)
 {
    if($check[0]=="200" && $check[1]=="200" )
    {
        $image = $_FILES['logo']['tmp_name'];
        $imageFileType = strtolower(pathinfo($_FILES['logo']['name'],PATHINFO_EXTENSION));
        if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg") {
            return '<div class="alert alert-danger">'.$imageFileType.' Logo file of only jpg/png/jpeg type is acceptable.</div>';
        }
        $imgContent = addslashes(file_get_contents($image));
        if($this->db->update("company", array('logo'=>$imgContent)))
        {
            return '<div class="alert alert-success">Logo has been updated successfully.</div>';
        }
        else
        {
            return '<div class="alert alert-danger">Error 101. Failed to update the logo.</div>';
        }
    }
    else
        return '<div class="alert alert-danger">Logo file of only 200px X 200px is acceptable.</div>';
}

Код для отображения изображения в представлении

echo '<img src="data:image/png;base64,'.base64_encode($companyinfo[0]->logo).'"/>';

Я загрузил png-файл, поэтому использовал данные: image / png

При проверке видимого элемента изображения я получаю следующий вывод:

<img src="data:image/png;base64,iVBORw0KGgpcMFwwXDAN ....... v6/IDhCwtLWDE56vdo6CwCC07dMeva1dhgIGnEBikg7xODG0Pq+m61z8bC4Vqpzxpq6d8BhQK7Q1+rte/oyhK61mIAoGRznxWpiYmb8jaleunKEotrSaXy1Xb1lnxXhXvSAGgKtXBetZJOQEAIQkBAQAhCQEAIQkBACEJA8P7xP2GoiDrA7B2BXDBcMFwwXDBJRU5ErkJggg==">

Все статьи через Интернет показывают это решение, но почему оно не работает на моем конце?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Краткий ответ:

Изменить

$imgContent = addslashes(file_get_contents($image));

на

$imgContent = file_get_contents($image);

Длинный ответ:

При применении addslashes() двоичные данные изображения изменяются, если оно содержит одну или несколько одинарных кавычек ('), двойных кавычек ("), обратной косой черты (\) или NUL (байта NUL). Он добавляет обратную косую чертуперед этими символами.

Это, вероятно, сделано для того, чтобы избежать SQL-инъекций в то время, когда подготовленные операторы не существовали или использовались редко. Например:

$imgContent = addslashes(file_get_contents($image));
$query = mysql_query ("insert into imageTable values ("INSERT INTO `product_images` (`id`, `image`, `image_name`) VALUES ('1', '{$imgContent}', '{$image_name}')"));

//Do Stuff like reading the image date from the database...

$imgContent = stripslashes($imgContent);
echo '<img src="data:image/png;base64,' . base64_encode($imgContent) . '"/>';

В наши дни не использовать подготовленные операторы - это плохая практика, и я подозреваю, что ваша библиотека базы данных также использует ее в следующей строке:

$this->db->update("company", array('logo'=>$imgContent));

Подготовленные операторы (используя * 1029Операторы * mysqli или PDO ) предотвратят внедрение SQL, что делает ненужным использование addslashes().

Примечания:

  • Убедитесь, что поле данных вашей базы данных достаточно велико (TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB) для размещения компаlete image (data).
  • Не сохраняйте данные изображения в кодировке base64 в базе данных, так как эти данные примерно на 30% больше двоичных данных.
  • Вместо этого предпочтительнее хранить изображения на файловом сервере.базы данных, поскольку хранение большого количества данных может замедлить работу сервера базы данных.
0 голосов
/ 16 февраля 2019

Вам необходимо сохранить изображение как base64_encode в базе данных.При загрузке измените свой код, как показано ниже:

$imgContent = base64_encode(file_get_contents($image));

, и когда вам нужно показать изображение, вам просто нужно разместить контент.Нет необходимости кодировать снова.Как показано ниже:

echo '<img src="data:image/png;base64,'.$companyinfo[0]->logo.'"/>';

Надеюсь, это поможет вам.

0 голосов
/ 16 февраля 2019

Попробовав предложения @dnFer, я попытался использовать полоски при отображении изображения.Все работало нормально.

 echo '<img src="data:image/png;base64,'.base64_encode(stripslashes($companyinfo[0]->logo)).'"/>';

Но у меня есть вопрос.Где-то я читал: «Когда я читал это, я увидел, что проблема заключалась в зачистке (). Поскольку данные являются двоичными, они могут содержать произвольные символы, равные косым чертам, поэтому они удаляют их».

Это будет проблемой?И остаются ли мои данные в безопасности после удаления косых черт?

0 голосов
/ 16 февраля 2019
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
</form>

Php код upload.php

<?php
include_once 'dbconn.php';
$image = $_FILE['image'];
$name = $image['name'];
$tmpname = $image['tmp_name'];
$imgdestination = '../img/'.$name;
move_uploaded_file($tmpname, $imgdestination);
?>
...