Невозможно использовать java .util.Base64 для кодирования изображения JPG в строку. - PullRequest
1 голос
/ 20 марта 2020

Я использую java .util.Base64 для кодирования нескольких изображений в строку переднего плана. Большинство изображений PNG работают, я могу преобразовать результат строки Base64 обратно в изображение с помощью онлайн-преобразования. Но файлы JPG как-то повреждены.

Я скопировал свою закодированную строку JPG base64 в онлайн-конвертер, который не может отобразить изображение. Затем я скачал это изображение на свой местный. Когда я пытаюсь открыть это изображение, зритель говорит:

Ошибка интерпретации файла изображения JPEG (не JPEG-файла: начинается с 0x99 0xaf)

Is Есть ли другой способ, которым я могу закодировать изображение JPG в строку и отправить его внешнему интерфейсу, чтобы внешний интерфейс мог отображать это изображение? Предполагается, что Base64 сейчас не работает для JPG.

Онлайн-конвертер говорит:

MIME файла был обнаружен как «application / octet-stream», но декодер отображает его как «image / octet-stream».

Предварительный просмотр Ваш браузер не может отобразить файл как «image / octet-stream».

Информация о файле • MIME-тип: image / octet-stream • Расширение: bin • Размер: 4 КБ • Загрузить: image.bin

private Map<String, String> download(byte[] output) throws IOException, ScriptException {
    try (ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(output))) {
      ZipEntry zipEntry = zis.getNextEntry();
      byte[] buffer = new byte[4096];
      Map<String, String> mapTable = new HashMap<>();
      int len;
      while (zipEntry != null) {
        String zipEntryName = zipEntry.getName();
        if (zipEntryName != null) {
          if (zipEntryName.endsWith(".png") || zipEntryName.endsWith(".jpg")) {
            String encodeImage = "";
            while ((len = zis.read(buffer)) > 0) {
              encodeImage = java.util.Base64.getEncoder().withoutPadding().encodeToString(buffer);
            }
            mapTable.put(zipEntryName, encodeImage);
          } else {
            StringBuilder sb = new StringBuilder();
            log.info("File Name " + zipEntryName);
            while ((len = zis.read(buffer)) > 0) {
              sb.append(new String(buffer, 0, len));
            }
            String dataStr = sb.toString();
            mapTable.put(zipEntryName, dataStr);
          }
        }
        zipEntry = zis.getNextEntry();
      }
      zis.closeEntry();
      return mapTable;
    } catch (IOException ioe) {
      log.error("IOException {}", ioe);
      throw ioe;
    }
  }
...