各位开发人员,大家好。
我正忙于android从应用程序上传图像。 我也可以使用它(代码将在下面)。 但是,当我发送大图像(10兆像素)时,我的应用程序因内存不足异常而崩溃。 一个解决方案是使用压缩,但是如果我要发送完整尺寸的图像怎么办? 我想也许有些东西在溪流中,但我不喜欢溪流。也许urlconnection可能有帮助,但我真的不知道。
我给文件名命名为File [0到9999] .jpg具有图像日期的发布值称为Filedata我为发布值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; }
使用ByteArrayOutputStream后再调用时#toByteArray(),实际上已使JPEG使用的内存量 增加 了 一倍 。ByteArrayOutputStream用编码的JPEG保留一个内部数组,当您调用#toByteArray()它时分配一个 新 数组并从内部缓冲区复制数据。
ByteArrayOutputStream
#toByteArray()
考虑将大型位图编码为临时文件,并使用FileOutputStream和FileInputStream编码并发送图像。
FileOutputStream
FileInputStream
如果没有“上传”,您的应用程序仅凭我认为的内存中的巨大位图就能“很好地”生存下来?
编辑: FileBody
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)));