Как проверить, закодирована ли строка в base64 или нет? - PullRequest
1 голос
/ 12 января 2020

Я хочу проверить HTML img sr c в формате base64 или нет в моем java весеннем бэкэнде. если он закодирован в Base64, я просто декодирую изображение и сохраняю его на своем сервере; если это не так, я сначала загружаю его на основе URL-адреса изображения, затем сохраняю на свой сервер. Я построил функции загрузки изображения и декодирования изображения. Но не могу разрешить проверку base64. Я попытался использовать оператор try catch check, но мне не нужно перехватывать ошибку, если она не base64. PS Я использую java .util.Base64

public boolean isBase64(String path) {
   try {
        Base64.getDecoder().decode(path);

    } catch(IllegalArgumentException e) {   
    }
}

Ответы [ 3 ]

1 голос
/ 12 января 2020

Если вы получите точное значение по атрибуту <img src="..." />, тогда оно должно иметь Формат URL-адреса данных

Простое регулярное выражение может определить, является ли URL-адрес данным или обычным. В java это может выглядеть как

    private static final Pattern DATA_URL_PATTERN = Pattern.compile("^data:image/(.+?);base64,\\s*", Pattern.CASE_INSENSITIVE);

    static void handleImgSrc(String path) {
        if (path.startsWith("data:")) {
            final Matcher m = DATA_URL_PATTERN.matcher(path);
            if (m.find()) {
                String imageType = m.group(1);
                String base64 = path.substring(m.end());
                // decodeImage(imageType, base64);
            } else {
                // some logging
            }
        } else {
            // downloadImage(path);
        }
    }
1 голос
/ 12 января 2020

Теоретически вы не можете решить, будет ли некоторая строка декодирована в base64 или нет, потому что случайно любая обычная строка может быть декодирована в base64.

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

В общем, я не вижу проблемы в вашем подходе, ваш метод просто нуждается в небольших улучшениях:

public boolean isBase64(String path) {
   try {
        Base64.getDecoder().decode(path);
        return true;
    } catch(IllegalArgumentException e) {   
        return false;
    }
}

На мой взгляд, этот подход очень неэффективен, потому что если данные являются base64 декодируемый Я предполагаю, что вы хотите, чтобы base64 декодировал данные. Поэтому в таком случае вы выполняете декодирование base64 дважды (один раз для проверки isBase64 и один раз для фактического кодирования). Поэтому я бы использовал что-то вроде этого:

public byte[] tryDecodeBase64(String path) {
   try {
        return Base64.getDecoder().decode(path);
    } catch(IllegalArgumentException e) {   
        return null;
    }
}
0 голосов
/ 25 января 2020

Я все еще не уверен, просматриваете ли вы URL или хотите проверить данные.
Для последнего вы можете сделать что-то вроде этого ...

/*
 * Some typical Image-File Signatures (starting @ byte 0)
 */
private static final byte[] JPG_1 = new byte[] {-1, -40, -1, -37};
private static final byte[] JPG_2 = new byte[] {-1, -40, -1, -18};
private static final byte[] PNG   = new byte[] {-119, 80, 78, 71, 13, 10, 26, 10};

public static boolean isMime(final InputStream ist) {
    /*
     * The number of bytes of Mime-encoded Data you want to read.
     * (4 * 19 = 76, which is MIMELINEMAX from Base64$Encoder)
     */
    final int    mimeBlockLength  =  4;  // <- MUST be 4!
    final int    mimeBlockCount   = 19;  // <- your choice
    final int    mimeBufferLength = mimeBlockCount * mimeBlockLength;

    final byte[] bar              = new byte[mimeBufferLength];

    try (final BufferedInputStream bis = new BufferedInputStream(ist, mimeBufferLength))
    {
        /*
         * We expect at least one complete Mime-encoded buffer...
         */
        if (bis.read(bar) != mimeBufferLength) {
            return false;
        }
        /*
         * Use a Java 9 feature to compare Signatures...
         */
        if (Arrays.equals(bar, 0, JPG_1.length, JPG_1, 0, JPG_1.length)
        ||  Arrays.equals(bar, 0, JPG_2.length, JPG_2, 0, JPG_2.length)
        ||  Arrays.equals(bar, 0, PNG  .length, PNG  , 0, PNG  .length)) {
            return true;
        } else {
            return false;
        }
    } catch (final IOException e) {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...