我想将图像从J2ME客户端发送到Servlet。
我能够获得图像的字节数组并使用HTTP POST发送它。
conn = (HttpConnection) Connector.open(url, Connector.READ_WRITE, true);
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
os.write(bytes, 0, bytes.length); // bytes = byte array of image
这是Servlet代码:
String line;
BufferedReader r1 = new BufferedReader(new InputStreamReader(in));
while ((line = r1.readLine()) != null) {
System.out.println("line=" + line);
buf.append(line);
}
String s = buf.toString();
byte[] img_byte = s.getBytes();
但我发现的问题是,当我从J2ME客户端发送字节时,会丢失一些字节。它们的值为0A
和0D
十六进制。确切地说,回车和换行。
因此,POST方法或readLine()
无法接受0A
和0D
值。
任何人都知道如何做到这一点,或者如何使用任何其他方法?
答案 0 :(得分:1)
那是因为您使用BufferedReader
逐行读取二进制流 。 readLine()
基本上拆分 CRLF上的内容。那些单独的行不再包含CRLF。
不要将BufferedReader
用于二进制流,它没有意义。只需将获得的InputStream
写入任何风格的OutputStream
,例如FileOutputStream
,usual Java IO way。
InputStream input = null;
OutputStream output = null;
try {
input = request.getInputStream();
output = new FileOutputStream("/path/to/file.ext");
byte[] buffer = new byte[10240];
for (int length = 0; (length = input.read(buffer()) > 0;) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) output.close();
if (input != null) input.close();
}
那就是说,你使用的Content-Type
在技术上是错误的。您没有在请求正文中发送WWW格式的URL编码值。您正在发送二进制流。它应该是application/octet-stream
或image
。这不是导致这个问题的原因,但这是完全错误的。