Pergunta

Eu uso javax.mail.a internet.MimeBody* versão 1.4.1

Meu programa quer enviar alguns dados binários com vários níveis de aninhamento de um servidor para cliente usando MimeMultiPart.Observei que, se em um nível, se usamos GetContent ele corrompe os dados.Eu era capaz de reproduzir esse problema com este fragmento de

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

}

Aqui é a saída

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

Eu completamente simplificado o código aqui e parece óbvio para usar o get(Raw)InputStream, mas temos nestedMultiPart e o nível superior estava fazendo getContent que causou a falha para alguns casos.

  1. A entrada é do tipo Array de bytes, mas no cliente getContent responde com a corda.O servidor define o conteúdo application/octet-stream, mas no lado do cliente é emitida como seqüência de caracteres.O que está errado aqui?
  2. Eu não tenho certeza por isso o byte c2 é adicionado antes 8c.O que há de tão especial sobre o 8c personagem?
  3. Qual é a diferença entre getInputStream e getRawInputStream.Quando usar um sobre o outro ?
Foi útil?

Solução

O que significa a completa fluxo de conter que o servidor é a criação e o cliente está lendo?

Observe que usando MimeMultipart sem MimeMessage, você está a perder algumas das coisas que são feitas automaticamente para você por MimeMessage, em particular, você está perdendo a chamada para MimeMultipart.updateHeaders().Uma vez que o método é protegido, você precisará subclasse MimeMultipart e chamar esse método antes de chamar writeTo.Se isso não resolver seu problema, mostre-nos os dados exatos que está sendo escrito e lido em sequência.

Como mencionado acima, se você estiver esperando dados binários, você quase certamente quererá usar getInputStream.O getRawInputStream oferece a você os dados antes de ter sido decodificada, por exemplo, o base64 entrada em vez de binário de saída.

Outras dicas

Não use getContent() se ele retorna uma Seqüência de caracteres e você deseja binário.Cadeia não é um recipiente para dados binários.Use getInputStream() e copiar os bytes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top