MimeBodypart getContentはバイナリデータを破損します
-
21-12-2019 - |
質問
私は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
.
ここでは、ここでのコードを完全に簡素化しました。
- 入力はバイト配列型のものですが、クライアントではGetContentが文字列で応答します。サーバーはコンテンツをアプリケーション/オクテットストリームに設定しますが、クライアント側では文字列として出力されます。ここで何が悪いのですか?
- 私は8cの前にバイトC2が追加された理由はわかりません。 8c文字についての特別なものは何ですか?
- GetInputStreamとGetRawInputStreamの違いは何ですか。いつ別の人の上に使うか?
解決
サーバーが作成していることとクライアントが読み取られていることを完全なストリームに含めるものは何ですか?
MimeMessageなしでMimeMultipartを使用することで、MimeSESSAGEによって自動的に行われたものの一部がありません。特にMimeMultipart.UpdateHeaders()への呼び出しがありません。メソッドは保護されているので、MimeMultiPartをサブクラス化し、WriteToを呼び出す前にそのメソッドを呼び出す必要があります。それがあなたの問題を解決しないならば、我々にストリーム上で読み書きされている正確なデータを見せてください。
上記のように、バイナリデータを期待している場合は、ほぼ確実にgetInputStreamを使用したいと思う。GetRawInputStreamは、それがデコードされる前にデータを提供します。例えば、バイナリ出力の代わりにBase64入力です。
他のヒント
文字列を返し、バイナリが必要な場合はgetContent()を使用しないでください。文字列はバイナリデータのコンテナではありません。getInputStream()を使用してバイトをコピーします。
所属していません StackOverflow