Java 使用InputStreams上载图像=内存不足错误

Java 使用InputStreams上载图像=内存不足错误,java,android,Java,Android,我正试图上传一张图片,但如果安卓设备上的图片文件超过2兆,我会遇到一些内存不足的错误 File file = new File(<my image file>); FileInputStream fis = new FileInputStream(file); HttpClient client = new HttpClient(); PutMethod method = new PutMethod(myUrl); RequestEntity requestEntity = ne

我正试图上传一张图片,但如果安卓设备上的图片文件超过2兆,我会遇到一些内存不足的错误

File file = new File(<my image file>);
FileInputStream fis = new FileInputStream(file);
HttpClient client = new HttpClient(); 
PutMethod method = new PutMethod(myUrl); 
RequestEntity requestEntity = new InputStreamRequestEntity(fis);
method.setRequestEntity(requestEntity); 
client.executeMethod(method); 
该类表示您仍在使用旧的

因此,您有3种选择:

  • 升级到可通过以下方式进行自我宣传:

    请求输出流,以避免通过直接流到服务器的套接字来缓冲任何内容体

    但不确定Android是否可以升级,因为它似乎是内置的

  • 遵循HttpClient 3.x中的请求实体流式处理建议

    请求流传输:流传输请求主体时遇到的主要困难是,由于身份验证失败或I/O失败,需要重试一些包含方法的实体。显然,无法重新读取和重新提交非缓冲实体。推荐的方法是创建一个能够重构底层输入流的自定义方法

    (snip,代码示例)

  • 抓取“纯香草”
    java.net.URLConnection
    ,将其转换为
    HttpURLConnection
    ,并设置流模式。例如

    ((HttpURLConnection) connection).setChunkedStreamingMode(1024);
    
    它将以1KB的块发送请求正文


  • 构造不带长度的
    InputStreamRequestEntity
    会导致它在本地缓冲数据,以便确定长度。因为它是一个文件,所以请改用
    FileRequestEntity
    ,因为它将根据文件确定大小。

    效果很好。我复制了FileRequestEntity,并将使用我自己的版本,因为它将为我提供一个完美的地方来连接进度条!
    ((HttpURLConnection) connection).setChunkedStreamingMode(1024);