Pregunta

Yo uso javax.mail.internet.mimebody * versión 1.4.1

Mi programa quiere enviar algunos datos binarios con múltiples niveles de anidación de un servidor a cliente utilizando MimemultipArt. Observé que si está en un nivel si usamos GetContent, corrompe los datos. Pude reproducir este problema con este fragmento

  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]));

}

Aquí está la salida

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

He simplificado completamente el código aquí y se ve obvio de usar la entrada de entrada (RAW), pero hemos anidado el multipart y el nivel superior estaba haciendo GetContent, lo que hizo que fallara por algunos casos.

  1. La entrada es de la matriz de bytes de tipo, pero en el cliente GetContent responde con cadena. El servidor establece el contenido a la conexión de aplicación / octeto, pero en el lado del cliente se emite como cadena. ¿Qué va mal aquí?
  2. No estoy seguro de por qué se agrega el byte C2 antes de 8c. ¿Qué es tan especial el carácter 8c?
  3. cuál es la diferencia entre getInputstream y getrawinputstream. ¿Cuándo usar uno sobre el otro?
¿Fue útil?

Solución

¿Qué contiene la transmisión completa que el servidor está creando y el cliente está leyendo?

Tenga en cuenta que al usar Mimemultipart sin mimemessage, falta algunas de las cosas que se realizan automáticamente por usted por Mimemessage, en particular, está perdiendo la llamada a Mimemultipart.UpdateHeaders ().Dado que el método está protegido, deberá subclase mimemultipart y llamará ese método antes de llamar a Writeto.Si eso no soluciona su problema, muéstrenos los datos exactos que se están escribiendo y lee en el flujo.

Como se mencionó anteriormente, si está esperando datos binarios, casi seguramente desea usar GetInputStream.El GetRawInputstream le brinda los datos antes de que se haya decodificado, por ejemplo, la entrada base64 en lugar de la salida binaria.

Otros consejos

No use GetContent () Si devuelve una cadena y desea binario.La cadena no es un contenedor para los datos binarios.Use getInputstream () y copie los bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top