最近工作需要实现使用 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. Lintcode: Kth Prime Number (Original Name: Ugly Number)

    Ugly number is a number that only have factors 3, 5 and 7. Design an algorithm to find the kth numbe ...

  2. 【介绍+安装】Nginx的介绍和安装详解

    == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单及占用系统 ...

  3. 全文搜索引擎Xapian

    安装过程 安装xapian-core wget http://oligarchy.co.uk/xapian/1.0.13/xapian-core-1.0.13.tar.gztar zxvf xapia ...

  4. mysql BLOB字段转String的方法

    1.通过sql直接转换 select CONVERT(GROUP_CONCAT(XXX) USING utf8 from usertable; 2.通过程序转换(注:本例用的是springmvc包装并 ...

  5. 人生苦短之我用Python篇(socket编程)

    socket模块 实现简单的远程连接: 客户端: import socket client = socket.socket()#声明socket类型,同时生成socke连接t对象 client.con ...

  6. mysql_connect

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

  7. HDU - 2639 Bone Collector II (01背包第k大解)

    分析 \(dp[i][j][k]\)为枚举到前i个物品,容量为j的第k大解.则每一次状态转移都要对所有解进行排序选取前第k大的解.用两个数组\(vz1[],vz2[]\)分别记录所有的选择情况,并选择 ...

  8. jq table页二级联动

    <div class="layerRtb layerRtb-threecolumn"> <div class="clearfix layerRtb-he ...

  9. linux常用命令:rpm 命令

    rpm是一个功能十分强大的软件包管理系统. 1.命令格式: rpm  [参数]  [包名] 2.命令功能: 使得在Linux下安装.升级和删除软件包的工作变得容易,并且具有查询.验证软件包的功能.与图 ...

  10. 出现“基础链接已关闭,无法链接到远程服务器"错误的解决办法

    一些用户在安装一些软件或是系统做某些修改后,采集器就没无登录或是无法获取到网页.登录或是使用httppostget工具会出现 ”基础链接已关闭,无法链接到远程服务器“的提示.经分析,是系统Socket ...