开胃菜的好日子。
我正忙着让Android从应用上传图片
我也让它工作(代码将在下面)
但是当我发送大图像(1000万像素)时,我的应用程序因内存异常而崩溃
对此的解决方案是使用压缩,但如果我想发送全尺寸图像怎么办?
我想也许有一些流,但我并不喜欢溪流。也许urlconnection可能会有所帮助,但我真的不知道。
我给文件名命名为File [0到9999] .jpg 带有图像日期的post值称为Filedata 我为post value dropboxid提供了一个UID
下面的代码有效,但我很乐意解决阻止我发送高分辨率图像的问题。
亲切的问候
try
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, bos);
byte[] data = bos.toByteArray();
HttpPost postRequest = new HttpPost(URL_SEND);
ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg");
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("Filedata", bab);
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String sResponse;
StringBuilder s = new StringBuilder();
while((sResponse = reader.readLine()) != null)
{
s = s.append(sResponse);
}
if(d) Log.i(E, "Send response:\n" + s);
}
catch (Exception e)
{
if(d) Log.e(E, "Error while sending: " + e.getMessage());
return ERROR;
}
答案 0 :(得分:3)
使用ByteArrayOutputStream
然后调用#toByteArray()
时,您实际上加倍 JPEG正在使用的内存量。 ByteArrayOutputStream
使用编码的JPEG保留内部数组,当您调用#toByteArray()
时,它会分配 new 数组&从内部缓冲区复制数据。
考虑将大位图编码为临时文件&使用FileOutputStream
和FileInputStream
编码并发送图片。
没有“上传” - 你的应用程序能够“很好地”存在于我假设的内存中的巨大位图中吗?
修改:FileBody
File img = new File(this is where you put the path of your image)
ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null);
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("Filedata", cb);
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));