Преобразование строки base64 в байтовый массив с использованием класса Json Serializable - PullRequest
0 голосов
/ 13 июня 2018

Я отправляю данные формы через ajax в формате JSON и в модели у меня есть переменная типа byte[] в классе модели

Изображение будет BASE64 format

var profileImage = $('#profileImage').attr('src');

Ajax-вызов:

$
            .ajax({
                type : 'PUT',
                url : baseUrl + "/restApi/UpdateUser",
                data : JSON
                        .stringify({
                             "fname" : fname,
                             "lname" : lname,
                             "password" : password,
                             "email" : email,
                             "profileImage":profileImage
                        }),
                success: function(){

                },

                error : function(e){
                    ////////////console.log(e);
                },
                dataType : "json",
                contentType : "application/json"
            });

В классе модели я использовал Serialization для преобразования моей строки Base64 в байтовый массив, поскольку значение json будет в строке.

Это мой класс модели GreenBusUser

@Lob
@Column(name="profile_picture")
@JsonDeserialize(using = StringtoByteArray.class)
private byte[] profileImage= null;

public byte[] getProfileImage() {
        return profileImage;
    }

    public void setProfileImage(byte[] profileImage) {
        this.profileImage = profileImage;
    }

class StringtoByteArray extends JsonDeserializer<byte []> {

    @Override
    public byte[] deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        return (Base64.getEncoder().encode(jsonParser.getText().getBytes(StandardCharsets.UTF_8)));
    }
}

, когда я печатаю свой журнал, чтобы получить картинку greenbususer.getProfileImage();

Я получаю странное значение:

[B @ 12db4fbd

Я не знаю, что является причиной проблемы, и она также не сохраняется в моей базе данных postgresql.Пожалуйста, разрешите.

ОБНОВЛЕНИЕ:

Я обновил некоторый код

return (Base64.getDecoder().decode(jsonParser.getText().getBytes(StandardCharsets.UTF_8)));

Как сказал Пол Уоррен, мне нужно десериализовать, тогда я должен декодировать тамЯ сделал это, но получил ошибку.

Error Log

Частично РАЗРЕШЕНО:

Это странно, и если кто-то может ответитьчто случилось здесь, тогда я приму его / ее ответ, а также помогу многим пролить свет на это.

Вместо того, чтобы декодировать (как сказал Тимур) строку base64 и вызвать метод getBytes, который я непосредственно вызвалМетод getBytes для строки base64.Например:

return (jsonParser.getText().getBytes("UTF-8"));

Но я получил, что столбец profile_image имеет тип bytea , а выражение имеет тип bigint .Перепишите или приведите выражение (что-то в этом роде).

Когда я, наконец, удалил выражение @Lob, оно работало без каких-либо проблем, пожалуйста, посмотрите.

Это моя база данных, где бинарные данные изображениявставили.enter image description here

1 Ответ

0 голосов
/ 13 июня 2018

Полученное значение является представлением "toString" байтового массива.Это не содержимое массива.В целях отладки вы можете просто записать байтовый массив в файл и проверить изображение стандартными инструментами.

Files.write(Paths.get("./debug_image.png"), greenBusUser.getProfileImage());

Также кажется, что вам нужно исправить ваш метод "десериализации" и заменить кодировку (byte [] -> Base64) на декодирование (Base64 -> byte []) .. Я верю, что это должно быть примерно так:

return Base64.getDecoder().decode(jsonParser.getText());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...