문제

i javax.mail.internet.mimebody * 버전 1.4.1

를 사용합니다.

My 프로그램은 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 (raw) InputStream을 사용하는 것이 명백 해 보이지만 NestedMultipArt를 사용하고 최상위 레벨은 어떤 경우에도 실패하게 된 GetContent를 수행했습니다.

  1. 입력은 유형 바이트 배열이지만 클라이언트 GetContent는 문자열로 응답합니다. 서버는 콘텐츠를 응용 프로그램 / 옥텟 스트림으로 설정하지만 클라이언트 측에서는 문자열로 출력됩니다. 여기서 뭐가 잘못 될거야?
  2. Byte C2가 8C 이전에 Byte C2가 추가되는지 모르겠습니다. 8C 캐릭터에 대한 특별한 것은 무엇입니까?
  3. getInputstream과 getrawinputstream의 차이점은 무엇입니까? 다른 사람보다 하나를 사용할 때?
도움이 되었습니까?

해결책

서버가 생성하고 클라이언트가 읽고있는 완전한 스트림이란 무엇입니까?

MimemElsage를 사용하지 않고 MimemultipArt를 사용하면 Mimemessage가 자동으로 수행되는 작업 중 일부가 누락되어 있으며 특히 MimemultipArt.UpdateHeaders ()에 대한 호출이 누락되었습니다.메소드가 보호되어 있으므로 Writeto를 호출하기 전에 MimemultipArt를 하위 클래스하고 해당 메소드를 호출해야합니다.그래도 문제가 해결되지 않으면 스트림에서 쓰여지고 읽는 정확한 데이터를 보여주십시오.

위에서 언급했듯이 바이너리 데이터를 기대하는 경우 거의 확실히 GetInputStream을 사용하려고합니다.getRawInputStream은 바이너리 출력 대신 Base64 입력을 예외하기 전에 디코딩되기 전에 데이터를 제공합니다.

다른 팁

문자열을 반환하고 바이너리를 원하는 경우 getContent ()를 사용하지 마십시오.문자열은 바이너리 데이터를위한 컨테이너가 아닙니다.getInputStream ()을 사용하고 바이트를 복사하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top