J2me multipart / form-data sending java.lang.exception Out of Memory Error - 需要帮助

时间:2010-10-15 00:36:38

标签: http java-me out-of-memory midlet midp

我正在尝试将图像从我的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

2 个答案:

答案 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手机上运行它,它表现得像是在休眠...所以它没用。

  1. 现在我应该使用for循环来处理'multipart / form-data'请求吗?
  2. 此类请求的最大块大小是多少?
  3. 还是其他任何想法? 此致