Question

J'utilise javax.mail.internet.mimebody * version 1.4.1

Mon programme souhaite envoyer des données binaires avec plusieurs niveaux de nidification d'un serveur au client à l'aide de MimemultiparT. J'ai observé que si à un niveau si nous utilisons GetContent, cela corrompt les données. J'ai pu reproduire ce problème avec cet extrait

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

}

Voici la sortie

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

J'ai complètement simplifié le code ici et il semble évident d'utiliser InputStreream Get (RAW), mais nous avons NuppartMultiparte et le niveau supérieur faisait GetContent qui lui faisait échouer pour certains cas.

  1. L'entrée est de type d'octet de type, mais sur le client GetContent répond avec une chaîne. Le serveur définit le contenu sur l'application / l'octet-flux, mais du côté du client, il est émis en tant que chaîne. Qu'est-ce qui ne va pas ici?
  2. Je ne sais pas pourquoi l'octet C2 est ajouté avant 8c. Qu'est-ce qui est si spécial sur le caractère 8C?
  3. Quelle est la différence entre GetinPuttream et GetrawinPutStream. Quand utiliser un sur l'autre?
Était-ce utile?

La solution

Que contient le flux complet que le serveur crée et que le client lit?

Notez que, en utilisant MimemultiPart sans Mimemessage, vous manquez certaines des choses qui sont faites automatiquement pour vous par Mimemessage, en particulier vous manquez l'appel à MimemultiparT.UPDateHeaders ().Étant donné que la méthode est protégée, vous aurez besoin de la sous-classement MimemultiparT et d'appeler cette méthode avant d'appeler Writeto.Si cela ne résout pas votre problème, montre-nous les données exactes qui sont écrites et lues sur le flux.

Comme mentionné ci-dessus, si vous attendez des données binaires, vous souhaitez presque certainement utiliser GetinPutStream.Le GetrawinPutStream vous donne les données avant qu'il a été décodé, par exemple, la saisie de base64 au lieu de la sortie binaire.

Autres conseils

N'utilisez pas getContent () s'il renvoie une chaîne et que vous voulez binaire.La chaîne n'est pas un conteneur pour les données binaires.Utilisez getinputtream () et copiez les octets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top