最近工作需要实现使用 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. Vue.js学习笔记——表单控件实践

    最近项目中使用了vue替代繁琐的jquery处理dom的数据更新,个人非常喜欢,所以就上官网小小地实践了一把. 以下为表单控件的实践,代码敬上,直接新建html文件,粘贴复制即可看到效果~ <! ...

  2. JS中“==”和“===”的原理和区别

    1.为什么讨论这个问题? - 有个说法,尽量不用==,而使用===,是这样吗? 2.分析问题,原理是什么? 下面说说ECMAScript 5 language specification里的说明: 1 ...

  3. Javascript-涨工资案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Object之wait

    一.源码. 1.公共本地,且可继承但不可重写. 2.公共,且可继承但不可重写. 3.公共,且可继承但不可重写. 二.解释. 1.因为这些方法是Object类中的非静态的public方法,而任何其他类都 ...

  5. ASIC中的一些库和文件类型

    以下内容均来源于网络: 在进行综合,分析STA时,有几种库类型. NLDM: 非线性线载模型,最基本的dot lib. 电压源模型,cap值是单一值.  在90nm工艺以下,由于晶体管的特性变得很复杂 ...

  6. wordpress 修改域名后的403

    wordpress的好处就是方便,不好呢,额,反正就是有. 最近,修改域名,也遇到了这个问题[修改域名后,出现403]. 网上的办法似乎有很多,但有一些并不好,比如修改数据库什么的,如果是新手,数据库 ...

  7. mysql_connect

    in this passage, we slove the problem about Mysql_connect. first, let' see an example: resource mysq ...

  8. Java的redis控制台-Jedis

    jedis 源码地址:https://github.com/xetorthio/jedis

  9. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  10. Unity VR编辑器――如上帝般创建VR内容,Project Soli google用雷达识别手势体积相当于一张 Mini SD 内存卡

    Unity VR编辑器――如上帝般创建VR内容在GDC的一个活动中,Unity首席设计师Timoni West展示了最新的Unity VR编辑器的原型系统,让你如上帝般创建VR应用,从一片空白场景开始 ...