`
shuai1234
  • 浏览: 935276 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

android下大文件分割上传

 
阅读更多
  1. 由于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 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 Studio实现FTP分割文件上传

    Android Studio编写的实现FTP分割文件上传例子。(大文件可以分割成小文件上传)

    Android TCPIP文件分割上传Demo

    Android TCPIP文件分割上传Demo,手机端用Android Studio编写,服务器端是用Eclipse编写。

    Android ftp文件分割上传,并且实现合并

    Android手机通过ftp协议,传输大文件到服务器的Demo,手机端是用Android Studio导入。

    Android多线程文件上传

    多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可。

    文件分割工具类(按字节分割)

    开发socket上传数据的时候,udp包有大小限制,所以需要按字节分割读取的文件。 网上找到的有没有合适的,就自己弄了一个。有需要可以试试。

    Android 4.1 Sources for Android SDK

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    Android 大文件切割与合并的实现代码

    关于上传文件的需求处理,做了一个Java的简单封装 DocumentManagement 。其中集成了,检测文件,MD5加密,Base64加密/解码,针对文件Base64加密处理,获取文件后戳,切割文件,合并文件等方法。 亲测可切割与合并...

    android sdk windows 5 0 18 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

    Android 4.1 Documention for Android SDK API16 v2 Jelly Bean

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    android sdk windows 5 0 16 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

    android sdk windows 5 0 10 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

    Android 4.1 SDK Tools 20.0.1 Jelly Bean

    下载安装顺序: 首先下载安装 【Android 4.1 SDK Tools 20.0.1】 http://download.csdn.net/detail/joe9i0/4462908 然后下载以下包解压到SDK Tools的安装目录 【ARM EABI v7a System Image】 文件超过上传限制,分割为...

    Android 4.1 Documention for Android SDK API16 v2 Jelly Bean(2/2)

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    Android 4.1 Jelly Bean Google APIs

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    Android 4.1 SDK Platform-tools v14 Jelly Bean

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    Android 4.1 ARM EABI v7a System Image (2/2)

    最新Android SDK (4.1): ...文件超过上传限制,分割为2个部分, 下载后使用7zip解压. ① http://download.csdn.net/detail/joe9i0/4488695 ② http://download.csdn.net/detail/joe9i0/4488705 【SDK Platform】 ...

    android sdk windows 5 0 11 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

    android sdk windows 5 0 21 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

    Google Android SDK开发范例大全 第2版(第二版)7/8

    今天看到我的上传权限被提升到了25MB,于是赶紧重新打包上传了一份,只需要下5个文件了。 需要下载的朋友请下载这个(区别是标题里的文件号,这个是x/8,新上传的是x/5):...

    android sdk windows 5 0 9 Lollipop 7z格式

    受限于上传文件70M限制,所以使用GSplit将原始文件分割,一共分了21个包,请大家逐一下载,最后用“disk1.EXE”(在最后一个包内)直接运行,合并成文件(android-sdk-windows.zip),解压缩后对应合并到你的 SDK ...

Global site tag (gtag.js) - Google Analytics