最近工作需要实现使用 Android 手机上传图片的功能, 参考了网络上的很多资料, 不过网络上的代码都仅仅适合上传较小的文件, 当上传较大文件时(我在自己的测试机器上发现是 2M 左右), 就会因为内存不足发生异常。异常一般发生在两个地方, 1. 将需要上传的文件读取到内存缓存时, 2. 调用 HttpUrlConnection 的 OutputStream 发送数据时。 为了解决这两个问题, 我使用了将上传数据写入临时文件, 然后调用 HttpPost 类来发送数据的办法, 代码如下

private String post(String command, Map<String, String> params, String format, String name, String type, Bitmap content) throws Exception 
    { 
        String BOUNDARY                = "-------1A2B3C4D5E6F"; 
        String MULTIPART_FORM_DATA    = "multipart/form-data"; 
         
        OutputStream outStream = null; 
        File         tmpFile   = iHompyFile.createRandomFile(); 
        if (tmpFile == null) 
        { 
            outStream  = new ByteArrayOutputStream(); 
        } 
        else 
        { 
            outStream = new FileOutputStream(tmpFile); 
        } 
 
        /** 
         * 填写数据 
         */ 
        try 
        { 
            if (params != null) 
            { 
                for(Map.Entry<String, String> entry : params.entrySet()) 
                { 
                    outStream.write(("--" + BOUNDARY + "/r/n").getBytes()); 
                    outStream.write(("Content-Disposition: form-data; name=/"" + entry.getKey() + "/"/r/n/r/n").getBytes()); 
                    outStream.write(entry.getValue().getBytes()); 
                    outStream.write(("/r/n").getBytes()); 
                } 
            } 
            outStream.write(("--" + BOUNDARY + "/r/n").getBytes()); 
            outStream.write(("Content-Disposition: form-data; name=/"" + format + "/"; filename=/"" + name + "/"/r/n").getBytes()); 
            outStream.write(("Content-Type: " + type + "/r/n/r/n").getBytes()); 
            content.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
            outStream.write(("/r/n--" + BOUNDARY + "--/r/n").getBytes()); 
        } 
        catch(Exception e) 
        { 
            throw new Exception("向数据流写入数据失败, 可能是内存空间不足!" + e.getMessage()); 
        } 
         
        HttpPost httpRequest = new HttpPost(myServer + command); 
        if (tmpFile != null) 
        { 
            outStream.flush(); 
            outStream.close(); 
             
            FileEntity entity = new FileEntity(tmpFile, MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); 
            entity.setContentEncoding("UTF-8"); 
            httpRequest.setEntity(entity); 
        } 
        else 
        { 
            ByteArrayEntity entity = new ByteArrayEntity(((ByteArrayOutputStream)outStream).toByteArray()); 
            entity.setContentType(MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); 
            entity.setContentEncoding("UTF-8"); 
            httpRequest.setEntity(entity); 
        } 
        
        HttpResponse httpResponse = myClient.execute(httpRequest); 
        int          httpCode     = httpResponse.getStatusLine().getStatusCode(); 
        if (tmpFile != null) 
        { 
            tmpFile.delete(); 
        } 
        if (httpCode != 200) 
        { 
            throw new Exception("Error response: " + httpResponse.getStatusLine().toString()); 
        } 
        return EntityUtils.toString(httpResponse.getEntity()); 
    }

测试时能成功发送 5M 左右的图片, 基本满足拍摄后上传照片的要求。

Android 上传大文件的更多相关文章

  1. android网络编程之HttpUrlConnection的讲解--上传大文件

    1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...

  2. [Asp.net]Uploadify上传大文件,Http error 404 解决方案

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...

  3. php 上传大文件配置upload_max_filesize和post_max_size选项

    php 上传大文件配置upload_max_filesize和post_max_size选项 (2014-04-29 14:42:11) 转载▼ 标签: php.ini upload _files[f ...

  4. PHP上传大文件 分割文件上传

    最近遇到这么个情况,需要将一些大的文件上传到服务器,我现在拥有的权限是只能在一个网页版的文件管理系统来进行操作,可以解压,可以压缩,当然也可以用它来在线编辑.php文件. 文件有40M左右,但是服务器 ...

  5. ASP.NET上传大文件的问题

    原文:http://www.cnblogs.com/wolf-sun/p/3657241.html?utm_source=tuicool&utm_medium=referral 引言 之前使用 ...

  6. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

    php 上传大文件主要涉及配置 upload_max_filesize 和post_max_size两个选项   今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了 ...

  7. SWFUpload上传大文件(暂时用用,真正用的时候还是要改的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. PHP上传大文件和处理大数据

    1. 上传大文件 /* 以1.5M/秒的速度写入文件,防止一次过写入文件过大导致服务器出错(chy/20150327) */ $is_large_file = false; if( strlen($x ...

  9. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

随机推荐

  1. Django-form组件和ModelForm组件

    一. 构建Form表单 通过建一个类,添加需要进行验证的form字段,继而添加验证条件 from django import forms from django.forms import widget ...

  2. http协议基础(三)几种数据传输方式

    说说http协议的一些特点: 1)无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议. 这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性 不过随着we ...

  3. 圆锥体完全均衡下重力异常正演 [MATLAB]

    在完全均衡的模型下,若地表有一圆锥体(山峰等),计算跨越山顶的截面上所得到的各种重力异常. 地壳密度 $kg\cdot m^{-3}$ 上地幔密度 $g\cdot cm^{-3}$ 地表地形圆锥体半径 ...

  4. 018-DNS解析过程与配置DNS服务

  5. \r与\n

    \n是换行,英文是New line \r是回车,英文是Carriage return

  6. linux常用命令:yum 命令

    用于添加/删除/更新RPM包,自动解决包的依赖问题以及系统更新升级. 1.命令格式:    yum  [参数] [软件名]2.命令功能:    功能:  yum提供了查找.安装.删除某一个.一组甚至全 ...

  7. Linux服务器配置---ftp限制带宽

    限制带宽 ftp服务器可以设置每个用户的带宽,这样根据实际需求来分配,更加充分的利用系统资源.带宽通过参数“anon_max_rate“和”local_max_rate“来设置,这两个参数在配置文件中 ...

  8. QQ在线客服,默认到要加好友,授权也不起作用需要先开通QQ营销服务

    QQ在线客服,默认到要加好友,授权也不起作用需要先开通QQ营销服务http://wpa.qq.com/msgrd?v=3&uin=你的客服QQ号码&site=qq&menu=y ...

  9. 硬件中断和DPC一直占40-52%左右 解决方法

    硬件中断和DPC一直占40-52%左右,突然感觉电脑变慢 重启后竟然启动不了了,冷却一段时间后才能进去,温度检测cpu,硬盘都超标了! 用Process Explorer检测硬件中断和DPC 占cpu ...

  10. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...