android下大文件分割上传
由于android自身的原因,对大文件(如影视频文件)的*作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。
文件分割后分多次请求服务。
1 //文件分割上传
2 public void cutFileUpload(String fileType,String filePath)
3 {
4 try
5 {
6 FileAccessI fileAccessI = new FileAccessI(filePath, 0);
7 Long nStartPos = 0l;
8 Long length = fileAccessI.getFileLength();
9 int mBufferSize = 1024 * 100; //每次处理1024 * 100字节
10 byte[] buffer = new byte[mBufferSize];
11 FileAccessI.Detail detail;
12 long nRead = 0l;
13 String vedioFileName = Usual.f_getUUID(); //分配一个文件名
14 long nStart = nStartPos;
15 int i = 0;
16 while (nStart < length)
17 {
18 detail = fileAccessI.getContent(nStart);
19 nRead = detail.length;
20 buffer = detail.b;
21 JSONObject mInDataJson = new JSONObject();
22 mInDataJson.put("a", "282");
23 mInDataJson.put("FileName", vedioFileName);
24 mInDataJson.put("start", nStart); //服务端获取开始文章进行写文件
25 mInDataJson.put("filetype", fileType);
26 nStart += nRead;
27 nStartPos = nStart;
28 String url = UsualA.f_getXmlSOAUrl(UsualA.mServiceFastByteUrl, "n.uploadvedio", mInDataJson.toString(),
29 "282");
30 HttpFastUtil.f_httpPostByte(url, buffer, false);
31 }
32 }
33 catch (Exception e)
34 {
35 }
文件分割类
1 package i****ong.mppsp.android.util;
2
3 import java.io.*;
4
5 public class FileAccessI implements Serializable
6 {
7
8 RandomAccessFile oSavedFile;
9 long nPos;
10
11
12 public FileAccessI() throws IOException
13 {
14 this("", 0);
15 }
16 public FileAccessI(String sName, long nPos) throws IOException
17 {
18 oSavedFile = new RandomAccessFile(sName, "rw");//创建一个随机访问文件类,可读写模式
19 this.nPos = nPos;
20 oSavedFile.seek(nPos);
21 }
22 public synchronized int write(byte[] b, int nStart, int nLen)
23 {
24 int n = -1;
25 try
26 {
27 oSavedFile.write(b, nStart, nLen);
28 n = nLen;
29 }
30 catch (IOException e)
31 {
32 e.printStackTrace();
33 }
34 return n;
35 }
36 //每次读取102400字节
37 public synchronized Detail getContent(long nStart)
38 {
39 Detail detail = new Detail();
40 detail.b = new byte[102400];
41 try
42 {
43 oSavedFile.seek(nStart);
44 detail.length = oSavedFile.read(detail.b);
45 }
46 catch (IOException e)
47 {
48 e.printStackTrace();
49 }
50 return detail;
51 }
52
53
54 public class Detail
55 {
56
57 public byte[] b;
58 public int length;
59 }
60
61 //获取文件长度
62 public long getFileLength()
63 {
64 Long length = 0l;
65 try
66 {
67 length = oSavedFile.length();
68 }
69 catch (IOException e)
70 {
71 // TODO Auto-generated catch block
72 e.printStackTrace();
73 }
74 return length;
75 }
76 }
服务端获得分割的文件,利用RandomAccessFile进行文件整理
1 /**
2 * 音视频图片处理
3 * @param mStr
4 * @return
5 * @throws Exception
6 */
7 public static String f_uploadVedio(String mStr) throws Exception
8 {
9 String mResult = Usual.mEmpty;
10 String fileType = Usual.mEmpty;
11 int startPosL = 0;
12 RandomAccessFile oSavedFile = null;
13 JSONObject jsonObject = new JSONObject(mStr);
14 String vedioJsonStr = jsonObject.getString("VEDIO");
15 byte[] vedioBytes = Usual.f_fromBase64String(vedioJsonStr);
16 startPosL = (Integer) jsonObject.get("start"); //接收客户端的开始位置(文件读取到的字节大小)
17 fileType = (String)jsonObject.getString("filetype");
18 String fileName = (String)jsonObject.getString("FileName");
19 if(fileType.equals("picture"))
20 {
21 oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");
22 }
23 else if(fileType.equals("photo"))
24 {
25 oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");
26 }
27 else if(fileType.equals("voice"))
28 {
29 oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp3","rw");
30 }
31 else if(fileType.equals("video"))
32 {
33 oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp4", "rw");
34 }
35 //设置标志位,标志文件存储的位置
36 oSavedFile.seek(startPosL);
37 oSavedFile.write(vedioBytes);
38 oSavedFile.close();
39 mResult = "000";
40 return mResult;
41 }
相关文章
- [Android Security] 静态分析Android程序——smali文件解析
- [Android Pro] linux下查看一个文件的属性(ls,lsattr,file,stat)
- Android 5.x特性概览三
- JAVA Eclipse的Android文件结构是怎么样的
- android wheelview实现三级城市选择
- android文件混淆详解
- Android API之android.provider.ContactsContract
- android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
- android xml文件中出现如下提醒:This tag and its children can be replaced by one <TextView/> and a compound drawable
- android 获取系统硬件信息
- 学习Android 的网站
- android开发分享Android中外接键盘的检测的实现
- Android 时间格式化工具
- Android Studio 详解build.gradle文件
- android.database.sqlite.SQLiteException: no such table: xxx (code 1 SQLITE_ERROR): , while compiling
- Android 10.0 修改SystemUI下拉QSPanel功能开关的显示顺序
- android 9.0 10.0 SystemUI禁用锁屏功能
- Android FTP服务器上传文件攻略
- 【Android 逆向】ELF 文件格式 ( ELF 程序头入口大小 | ELF 程序头入口个数 | ELF 文件节区头入口大小 | ELF 文件节区头入口个数 | 字符表序号 )
- 【Android 逆向】Android 系统中文件的用户和分组 ( 文件所有者与分组 | /sdcard/ 的文件分组 | /data/ 目录分析 | 用户类型 )
- 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
- Android的Bitmap和BitmapDrawable类解析-android学习之旅(六十)
- Android项目打包成APK文件
- android ViewPager具体解释
- android:padding和android:margin的区别
- Android相关属性的介绍:android:exported = true
- Android培训班(52)
- Android培训班(66)dex文件打开流程
- Android 11.0 Settings主页面去掉FocusRecyclerView(主菜单多余项)相关功能
- Android 11.0 修改添加的默认文件夹为9宫格样式
- Android JNI文件操作常用函数