Вопрос

Я использую javax.mail.internet.mimebody * версия 1.4.1

Моя программа хочет отправить несколько двоичных данных с несколькими уровнями вложения с сервера на клиента с использованием MimemUltiPART. Я заметил, что если на уровне, если мы будем использовать GetContent, он развращает данные. Я смог воспроизвести эту проблему с этим фрагментом

  public static void CreateResponse() throws Exception {
        //Simulate the Server side
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        MimeMultipart multiPartValues = new MimeMultipart();
        MimeBodyPart valueBody = new MimeBodyPart();

        byte[] firstKeyValue = new byte[] { (byte)0x8c};
        valueBody.setContent(firstKeyValue,"application/octet-stream");
        valueBody.addHeader(RestMessageHeaders.CONTENT_LENGTH,
                Integer.toString(firstKeyValue.length));
        multiPartValues.addBodyPart(valueBody);

        Object input = valueBody.getContent();
        System.out.println(String.format("input %02X", ((byte[])input)[0]));
        multiPartValues.writeTo(outputStream);

        //Simulate the client side
        byte[] mimeOutput = outputStream.toByteArray();

        ByteArrayDataSource ds = new ByteArrayDataSource(mimeOutput,
                "multipart/mixed");
        MimeMultipart mp = new MimeMultipart(ds);
        MimeBodyPart part = (MimeBodyPart) mp.getBodyPart(0);

        byte[] myOutput = new byte[1];
        //Verified that getContent returns a String, why ?? 
        Object output = part.getContent();
        System.out.println("getContent type " + output.getClass());
        String result = (String)output;
        ByteArrayDataSource partDS = new ByteArrayDataSource(result, "multipart/mixed");
        partDS.getInputStream().read(myOutput); 
        System.out.println(String.format("getContent %02X %02X", result.getBytes()[0],result.getBytes()[1]));
        System.out.println(String.format("getContent %02X", myOutput[0]));

        part.getInputStream().read(myOutput);
        System.out.println(String.format("getInputStream %02X", myOutput[0]));

        part.getRawInputStream().read(myOutput);
        System.out.println(String.format("getRawInputStream %02X", myOutput[0]));

}
.

Вот выход

        input 8C
        getContent type class java.lang.String
        getContent C2 8C
        getContent C2
        getInputStream 8C
        getRawInputStream 8C
.

Я полностью упростил код здесь, и он выглядит очевидно, чтобы использовать Get (Roam) ввода ввода, но у нас есть NestedMultiPART, а верхний уровень делал GetContent, который привел к нему в некоторых случаях.

  1. вход имеет тип байтового массива, но на клиенте GetContent отвечает строкой. Сервер устанавливает содержимое на приложение / октет-поток, но на стороне клиента он выводится в виде строки. Что здесь не так?
  2. Я не уверен, почему байт C2 добавляется до 8C. Что такое особенное в характере 8C?
  3. Что такое разница между getinputstream и getrawinputtream. Когда использовать один над другим?
Это было полезно?

Решение

Что содержит полный поток, чтобы сервер создавал, и клиент читает?

Обратите внимание, что, используя MimemUltiPART без MimEdsage, вы упускаете некоторые вещи, которые сделаны автоматически для вас MimeMessage, в частности, вы не пропустите вызов MimemUltiPart.updateHeaders ().Поскольку метод защищен, вам понадобится подкласс MimemUltiPART и вызовите этот метод перед вызовом WriteTo.Если это не устраняет вашу проблему, покажите нам точные данные, которые записываются и читают на потоке.

Как уже упоминалось выше, если вы ожидаете двоичных данных, вы почти наверняка хотите использовать GetInPutStream.GetRawinPutStream дает вам данные, прежде чем она будет декодирована, например, вход базового64 вместо двоичного выхода.

Другие советы

Не используйте GetContent (), если он возвращает строку, и вы хотите двоичные.Строка не является контейнером для двоичных данных.Используйте GetInputStream () и скопируйте байты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top