安卓分段上传文件、视频

安卓上传图片的时候,还可以压缩,

但是上传视频的时候,没有好的压缩方式。

后来想到两种解决方式

1是用传统的http post 方式上传,传的内容是文件流,不过不知道承受力有多大,优点是这个方法已经成熟,传文件流,把传base64 处理过的,内存溢出情况少很多。

2是android 端,分段上传文件。

第二种是根本解决内存溢出方法

其核心思想是

1 同一个文件,分段上传上去采用相同的名字,后台把接收到的base64 数据拼接。

2 既然是分段,传完一段才能传下一段,并且完整拼接。

每个段都传完了,证明这个文件传完,这个判断在安卓端实现。

我做的时候参考文章http://blog.csdn.net/defonds/article/details/8575893

这个是java写的。缺陷是没有把小文件包含进去。

下面我附上我的完整代码,用的是webService方式上传,代码可能不够精简,希望大家提出意见

/**

* 分段上传视频

*/

private void sectionUpload() {

File file = new File(videoPath);

int fileLen = 0;

try {

FileInputStream fis = new FileInputStream(file);

fileLen = fis.available();

} catch (FileNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

// 31457280 30M

if (fileLen >= 31457280) {

tishiDialog(WeiGuiAPIActivity.this, "上传文件不能大于30M");

return;

}

AsyncShowDialog.dialogShow(this);

new Thread() {

public void run() {

try {

int blockIndex = 1;

int blockNumber = 1;

String ext = videoPath

.substring(videoPath.lastIndexOf("."));//

// 有后缀之后,还得存一个图片名字

String fileName = Tools.getCurrentUtcTime_no_space() + ext;

FileInputStream fis = null;

ByteArrayOutputStream baos = null;

// 现在是要得到一个路径

File file = new File(videoPath);

fis = new FileInputStream(file);

RandomAccessFile raf = new RandomAccessFile(file, "r");// 负责读取数据

int fileLen = fis.available();

// 视频格式、大小

blockNumber = (int) (fileLen / blockSize);

// 10704745

if (fileLen % blockSize != 0) {

blockNumber = blockNumber + 1;

}

while (blockIndex <= blockNumber) {

BufferedInputStream bis = new BufferedInputStream(fis);

// bis.read(buffer, byteOffset, byteCount)

baos = new ByteArrayOutputStream();

// byte[] buffer_1 = new byte[1024 * 1024];

byte[] buffer = new byte[1024];

String uploadBuffer = null;

// fis.read(buffer, byteOffset, byteCount);

// 写是1kb 1,kb

if (blockIndex == 1) {

int n = 0;

long readLength = 0;// 记录已读字节数

if (fileLen >= blockSize) {

while (readLength <= blockSize - 1024) {// 大部分字节在这里读取

n = raf.read(buffer, 0, 1024);

readLength += 1024;

baos.write(buffer, 0, n);

}

if (readLength < blockSize) {// 余下的不足 1024

// 个字节在这里读取

// n = raf.read(buffer, 0, (int)(blockSize -

// readLength));

n = raf.read(buffer, 0, 1024);

baos.write(buffer, 0, n);

}

} else {

while (readLength <= fileLen - 1024) {// 大部分字节在这里读取

n = raf.read(buffer, 0, 1024);

readLength += 1024;

baos.write(buffer, 0, n);

}

}

} else if (blockIndex < blockNumber) {// 既不是第一块,也不是最后一块

raf.seek(blockSize * (blockIndex - 1));// 跳过前[块数*固定大小

// ]个字节

// fis.skip(blockSize * (blockIndex - 1));

int n = 0;

long readLength = 0;// 记录已读字节数

while (readLength <= blockSize - 1024) {// 大部分字节在这里读取

n = raf.read(buffer, 0, 1024);

readLength += 1024;

baos.write(buffer, 0, n);

}

if (readLength <= blockSize) {// 余下的不足 1024 个字节在这里读取

n = raf.read(buffer, 0,

(int) (blockSize - readLength));

baos.write(buffer, 0, n);

}

} else {// 最后一块

raf.seek(blockSize * (blockIndex - 1));// 跳过前[块数*固定大小

// ]个字节

int n = 0;

while ((n = raf.read(buffer, 0, 1024)) != -1) {

baos.write(buffer, 0, n);

}

}

// while((count = fis.read(buffer)) >= 0) {

// baos.write(buffer, 0, count);

// }

try {

if (baos != null) {

baos.flush();

baos.close();

}

if (fis != null) {

fis.close();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// uploadBuffer = new String(Base64.encode(baos

// .toByteArray()));

// baos.flush();

// 难道这里需要写一个循环上传

try {

// 其实是这句话内存泄露了

uploadBuffer = new String(Base64.encode(baos

.toByteArray()));

} catch (OutOfMemoryError e) {

// TODO Auto-generated catch block

Toast.makeText(WeiGuiAPIActivity.this, "内存泄露", 0)

.show();

e.printStackTrace();

}

// 这块容易内存泄露

// String test = baos.toByteArray().toString();

List<WSParam> params = new ArrayList<WSParam>();

// int size = uploadBuffer.length();

params.add(new WSParam("filename", fileName));

params.add(new WSParam("data", uploadBuffer));

params.add(new WSParam("pwd", MyData.Md5PWD));

String strResult = null;

try {

Connection2PHP connection = new Connection2PHP();

Object result = null;

try {

result = connection.callWebService(

MyData.webServiceURL, "uploadVideo",

params);

} catch (Exception e) {

e.printStackTrace();

}

if (result == null) {

Tools.log("服务器没有开");

strResult = "";

// 上传错误,重新上传。

continue;

} else {

strResult = result.toString();

CommonJSONParser parser = new CommonJSONParser();

Map map = parser.parse(strResult);

String videoName = map.get("filename")

.toString();

// 只取第一段的时候的值

if (blockIndex == 1) {

sb_video = sb_video.append(videoName + "#");

}

}

} catch (Exception e) {

e.printStackTrace();

}

blockIndex++;

}

//

Message msg = handler.obtainMessage();

msg.what = 1;

Bundle bundle = new Bundle();

bundle.putString("result", "上传成功");

msg.setData(bundle);

handler.sendMessage(msg);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

}

};

}.start();

}

安卓分段上传文件、视频

时间: 2024-12-14 18:21:07

安卓分段上传文件、视频的相关文章

关于ajax分段上传文件实例~

本来打算写的勤快一点的,谁知道最近好忙啊,忙着应聘的事情,这里突然想提一下自己的历程 自己现在是一只大三狗,高中三年是玩过去了,上了一所省内普通的不能再普通的二本.不过在大学里还算的上勤奋,大一上在学生会搅搅水,大一下就开始在学校网络中心里面干活,网络维护是工作,编程是兴趣,基本上每天网络中心寝室两点一线,所以说还算得上勤奋.不过现在我自己算是明白,很多事情不是勤奋就好了的,方法不对,真的是事倍功半.自己之前学习东西都是瞎倒腾,看书,看视频,记笔记,写demo.看起来稀疏平常,但是自己缺点在于太

安卓上传文件至PHP服务器

前两个月有幸参加一次免费培训,开发了一款小软件.发现AsyncHttpClient还真是好用. 直奔主题,安卓上传文件至PHP服务器: 1.PHP端服务器: <?php //链接数据库 include ("config/db.php"); //获取用户id $userid = $_POST['userid']; //处理上传文件 $base_path = "upload/"; $fileName=$_FILES['file']['name']; $name=e

MVC与webservice上传文件(图片和视频),希望帮且到一些朋友

最近做一个项目,要把图片和视频传到服务器上(网站与图片服务器分开),在网上找了好久,没找到完整的资料. 自己也折腾了半天,才把完整的代码实现完.可能好多朋友都有实现过,没分享代码吧,写得不好希望不要见笑!! 下面贴代码吧:首先MVC代码: public string UploadVide() { string requesturl = ""; string result = "video/Videoitem/"; HttpFileCollectionBase fil

Android开发笔记(一百一十)使用http框架上传文件

HTTP上传 与文件下载相比,文件上传的场合不是很多,通常用于上传用户头像.朋友圈发布图片/视频动态等等,而且上传文件需要服务器配合,所以容易被app开发者忽略.就上传的形式来说,app一般采用http上传文件,很少用ftp上传文件. HttpURLConnection上传 很可惜Android没有提供专门的文件上传工具类,所以我们要自己写代码实现上传功能了.其实也不难,一样是按照普通网络访问的POST流程,只是要采用"multipart/form-data"方式来分段传输.另外文件上

java 附件上传时后台验证上传文件的合法性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

腾讯对象存储服务COS加密签名上传文件与下载文件的剖析,福利提供给所有使用Android的小伙伴们!

在做一些用户需求的时候,公司往往需要工程师采集到更多有用的关于用户的个人信息,然后对用户群进行分析,今天我不是来分析这些的,今天我主要是说 腾讯推出的款云产品,那就是对象存储服务COS,这个产品面向所有开发者,新用户都有免费享有10G的使用权,10G可能对于做方案的工程师来说可能是微不 足道的,比如后视镜和车载方案,会常常需要用到视频的存储与云分享,当然这里不是只本地存储哦,我指的是用户在使用方案商的方案的时候,比如他开车 的时候录了一段视频需要分享到某个域,共享给大家看,比如微信,这时候他肯定

jQuery之批量上传文件插件之一

$("#uploader").plupload({     /*常规设置*/     runtimes:'html5,flash,silverlight,html4',     url:'hyzx/seller/commPicUpload.action',     /*最大文件限制b, kb, mb, gb, tb */     max_file_size:'1mb',     /*是否生成唯一文件名,如果为true会为上传的文件唯一的文件名.*/     unique_names:t

上传应用并生成下载链接需要多少钱;安卓市场上传应用需要什么

联系QQ:2205357007 上传应用并生成下载链接需要多少钱:安卓市场上传应用需要什么 上传应用程序到安卓分发市场时,经常需要填写一些有关apk安装包的信息.而作为非技术开发人员的我们同样需要识记一下这些信息,在下载安装包.安装应用到手机时,都是非常有用的. 目前,安卓应用的分发市场很多,但不需要所有的市场都要上传一遍,尤其是覆盖用户数量小的分发市场.常见的分发市场有: 百度系:百度手机助手.91手机助手.安卓市场 360手机助手.淘宝手机助手.小米手机助手.腾讯应用宝.豌豆荚.机锋市场等这

spring mvc + xmlHttpRequest2.0 实现无刷新上传文件,带进度条和剩余时间

1.springmvc支持文件上传,需要在spring-mvc.xml配置文件中加上下面的一段话: <!-- 支持上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 2.下面介绍下XMLHttpRequest2.0 最早,微软在IE 5引进了这个接口.因为它太有用,其