Android 上传大文件
最近工作需要实现使用 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 上传大文件的更多相关文章
- android网络编程之HttpUrlConnection的讲解--上传大文件
1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...
- [Asp.net]Uploadify上传大文件,Http error 404 解决方案
引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...
- 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 ...
- PHP上传大文件 分割文件上传
最近遇到这么个情况,需要将一些大的文件上传到服务器,我现在拥有的权限是只能在一个网页版的文件管理系统来进行操作,可以解压,可以压缩,当然也可以用它来在线编辑.php文件. 文件有40M左右,但是服务器 ...
- ASP.NET上传大文件的问题
原文:http://www.cnblogs.com/wolf-sun/p/3657241.html?utm_source=tuicool&utm_medium=referral 引言 之前使用 ...
- php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
php 上传大文件主要涉及配置 upload_max_filesize 和post_max_size两个选项 今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了 ...
- SWFUpload上传大文件(暂时用用,真正用的时候还是要改的)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP上传大文件和处理大数据
1. 上传大文件 /* 以1.5M/秒的速度写入文件,防止一次过写入文件过大导致服务器出错(chy/20150327) */ $is_large_file = false; if( strlen($x ...
- QQ上传大文件为什么这么快
今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...
随机推荐
- Canvas标签基础
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++Builder6.0 新建和打开项目软件死机
大清早上班打开C++Builder6.0软件,打开项目却卡死,甚是奇怪,然后尝试新建项目也同样卡死.尝试打开一个CPP文件,可以打开,再尝试打开项目.bpr文件,便打开了.至于原因为什么,那就不得而知 ...
- HDU 5059 Help him(简单模拟题)
http://acm.hdu.edu.cn/showproblem.php?pid=5059 题目大意: 给定一个字符串,如果这个字符串是一个整数,并且这个整数在[a,b]的范围之内(包括a,b),那 ...
- Python: 列表,元组,字典的区别
Python中有3种内建的数据结构:列表,元组和字典 1.列表 list是处理一组有序项目的数据结构,即可以在一个列表中存储一个序列的项目.列表中项目应该包括在方括号中,这样python就知道是在指明 ...
- CSS3实现8种Loading效果【二】
CSS3实现8种Loading效果[二] 今晚吃完饭回宿舍又捣鼓了另外几种Loading效果,老规矩,直接“上菜“…… 注:gif图片动画有些卡顿,非实际效果! 第一种效果: 代码如下: < ...
- pythoy的configparser模块
生成配置文件的模块 DEFAULT块,在以块为单位取块的值时,都会出现 import configparser config = configparser.ConfigParser() #相当于生成了 ...
- Linux 搭建FTP
Linux 搭建FTP 步骤一:安装 vsftpd 1,运行以下命令安装 vsftpd. yum install -y vsftpd 出现下图表示安装成功. 2,打开etc/vsftpd cd /et ...
- Mysql 更改编码方式
Mysql 更改编码方式 --查看编码方式 show variables like 'char%'; --设置编码方式 set character_set_server=utf8;
- JS中怎么调用<%%>的值
JS中怎么调用<%%>的值 示例代码一: <% String usercode = request.getParameter("usercode");//用req ...
- 更改 Centos 6 的 yum 源
1.查看当前使用的源: yum repolist all 阿里源网址,使用方法点右边的帮助可以看到:https://opsx.alibaba.com/mirror 2.更改源: 第一步:备份你的原镜像 ...