我正在尝试将图像从我的midlet发送到HTTP服务器。图像被转换为字节 并使用http multipart / form-data请求格式发送到服务器。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());
当图像大小小于500Kb时,代码工作正常,但是当大小大于它显示时:未捕获异常java.lang.OutOfMemoryError。我尝试使用Java ME SDK 3.0和Nokia S40 5th edition FP1。任何帮助是极大的赞赏。谢谢你看
我使用了以下类文件:click here
答案 0 :(得分:4)
被迫使用第一个`getFileBytes()将整个文件读入内存,以便以一个整体进行传输,很可能是系统内存不足。
找到一种方法来读取大约100K,传输它,然后再读取100,直到整个文件完成。
编写的HttpMultipartRequest
类的构造函数仅允许将文件作为单个对象传输。即使它是MIME多部分内容协议的实现,它仅限于传输一部分的情况:
可以修改类以允许发送多个部分。看一下协议规范RFC1341,特别是中间的示例。
将这三行放在构造函数中,整个文件一起发送;
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());
但是在多部分案例中,在endBoundary
:
for(bytes=getMoreFileBytes(); ! bytes.empty; bytes=getMoreFileBytes()){
bos.write(boundaryMessage.getBytes());
bos.write(bytes);
}
bos.write(endBoundary.getBytes());
作为快速修复,让构造函数打开文件并一次读取100k。它已收到fileName
参数。
另一端的PHP脚本应该重新组装原始文件。
答案 1 :(得分:0)
我对论坛规则不太熟悉,我试着评论你的答案,但它显示出否定。
好.. 现在我收到java.io.IOException:第一个块发送后丢弃持久连接,无法重试
之前我尝试使用带有Basec编码的application / x-www-form-urlencoded请求类型,使用kidcandy的代码:http://forums.sun.com/thread.jspa?threadID=538500
此代码将图像数据划分为块以避免“持久连接丢失”问题,并使用“for”循环创建与服务器的连接。问题是最大块大小可能只有500-700字节。因此,为了发送一个100kb的图像,代码需要创建和关闭连接200次,我试图在诺基亚5310手机上运行它,它表现得像是在休眠...所以它没用。