0

我正在尝试将图像从我的 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 和诺基亚 S40 第 5 版 FP1。任何帮助是极大的赞赏。感谢您的关注

我使用了以下类文件:点击这里

4

2 回答 2

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 脚本应该从各个部分重新组装原始文件。

于 2010-10-15T03:49:03.013 回答
0

我对论坛规则不是很熟悉,我试图评论您的答案,但结果是否定的。

好的..现在我得到 java.io.IOException: Persistent connection dropped after first chunk sent, cannot retry

以前我尝试在这里使用 Kidcandy 的代码使用带有 Base64 编码的 application/x-www-form-urlencoded 请求类型:http://forums.sun.com/thread.jspa?threadID= 538500

此代码将图像数据分成块以避免“持久连接丢失”问题,并使用“for”循环创建与服务器的连接。问题是最大块大小可能只有 500-700 字节。所以要发送一个 100kb 的图像,代码需要创建和关闭连接 200 次,我尝试在诺基亚 5310 手机上运行它,它的行为就像它正在休眠......所以它没有用。

  1. 现在我应该将那个for循环用于'multipart/form-data'请求吗?
  2. 此类请求的最大块大小是多少?
  3. 还是有其他想法?问候
于 2010-10-15T23:18:28.160 回答