android下大文件分割上传
16lz
2022-06-10
-
由于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 ishitong.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 IOException13 {14 this("", 0);15 }16 public FileAccessI(String sName, long nPos) throws IOException17 {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 try26 {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 try42 {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 Detail55 {56 57 public byte[] b;58 public int length;59 }60 61 //获取文件长度62 public long getFileLength()63 {64 Long length = 0l;65 try66 {67 length = oSavedFile.length();68 }69 catch (IOException e)70 {71 // TODO Auto-generated catch block72 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 项目串口通信(serialPort)开发遇到的炕
- Android(安卓)DataBinding的简单使用
- Android下pm 命令详解
- Android(安卓)studio配置Opencv开发环境
- android背景选择器selector用法汇总
- csr8811蓝牙芯片porting总结
- android通用文件操作
- android播放网络音频
- NPM 和webpack 的基础使用