1. 由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。

  • 文件分割后分多次请求服务。

     //文件分割上传
    public void cutFileUpload(String fileType,String filePath)
    {
    try
    {
    FileAccessI fileAccessI = new FileAccessI(filePath, 0);
    Long nStartPos = 0l;
    Long length = fileAccessI.getFileLength();
    int mBufferSize = 1024 * 100; //每次处理1024 * 100字节
    byte[] buffer = new byte[mBufferSize];
    FileAccessI.Detail detail;
    long nRead = 0l;
    String vedioFileName = Usual.f_getUUID(); //分配一个文件名
    long nStart = nStartPos;
    int i = 0;
    while (nStart < length)
    {
    detail = fileAccessI.getContent(nStart);
    nRead = detail.length;
    buffer = detail.b;
    JSONObject mInDataJson = new JSONObject();
    mInDataJson.put("a", "282");
    mInDataJson.put("FileName", vedioFileName);
    mInDataJson.put("start", nStart); //服务端获取开始文章进行写文件
    mInDataJson.put("filetype", fileType);
    nStart += nRead;
    nStartPos = nStart;
    String url = UsualA.f_getXmlSOAUrl(UsualA.mServiceFastByteUrl, "n.uploadvedio", mInDataJson.toString(),
    "282");
    HttpFastUtil.f_httpPostByte(url, buffer, false);
    }
    }
    catch (Exception e)
    {
    }
  • 文件分割类
     package ishitong.mppsp.android.util;
    
     import java.io.*;
    
     public class FileAccessI implements Serializable
    { RandomAccessFile oSavedFile;
    long nPos; public FileAccessI() throws IOException
    {
    this("", 0);
    }
    public FileAccessI(String sName, long nPos) throws IOException
    {
    oSavedFile = new RandomAccessFile(sName, "rw");//创建一个随机访问文件类,可读写模式
    this.nPos = nPos;
    oSavedFile.seek(nPos);
    }
    public synchronized int write(byte[] b, int nStart, int nLen)
    {
    int n = -1;
    try
    {
    oSavedFile.write(b, nStart, nLen);
    n = nLen;
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    return n;
    }
    //每次读取102400字节
    public synchronized Detail getContent(long nStart)
    {
    Detail detail = new Detail();
    detail.b = new byte[102400];
    try
    {
    oSavedFile.seek(nStart);
    detail.length = oSavedFile.read(detail.b);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    return detail;
    } public class Detail
    { public byte[] b;
    public int length;
    } //获取文件长度
    public long getFileLength()
    {
    Long length = 0l;
    try
    {
    length = oSavedFile.length();
    }
    catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return length;
    }
    }
  • 服务端获得分割的文件,利用RandomAccessFile进行文件整理
     /**
    * 音视频图片处理
    * @param mStr
    * @return
    * @throws Exception
    */
    public static String f_uploadVedio(String mStr) throws Exception
    {
    String mResult = Usual.mEmpty;
    String fileType = Usual.mEmpty;
    int startPosL = 0;
    RandomAccessFile oSavedFile = null;
    JSONObject jsonObject = new JSONObject(mStr);
    String vedioJsonStr = jsonObject.getString("VEDIO");
    byte[] vedioBytes = Usual.f_fromBase64String(vedioJsonStr);
    startPosL = (Integer) jsonObject.get("start"); //接收客户端的开始位置(文件读取到的字节大小)
    fileType = (String)jsonObject.getString("filetype");
    String fileName = (String)jsonObject.getString("FileName");
    if(fileType.equals("picture"))
    {
    oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");
    }
    else if(fileType.equals("photo"))
    {
    oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");
    }
    else if(fileType.equals("voice"))
    {
    oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp3","rw");
    }
    else if(fileType.equals("video"))
    {
    oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp4", "rw");
    }
    //设置标志位,标志文件存储的位置
    oSavedFile.seek(startPosL);
    oSavedFile.write(vedioBytes);
    oSavedFile.close();
    mResult = "000";
    return mResult;
    }

android下大文件分割上传的更多相关文章

  1. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  2. Html5 突破微信限制实现大文件分割上传

    先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...

  3. formdata方式上传文件,支持大文件分割上传

    1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...

  4. PHP大文件分割上传(分片上传)

    服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_max_filesize = 2M //PHP最大能接受的文件大小 post_max_size = 8M //PHP能收 ...

  5. PHP实现大文件分割上传与分片上传

    转载:http://www.zixuephp.com/phpstudy/phpshilie/20170829_43029.html 服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 u ...

  6. js大文件分割上传

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  7. PHP大文件分片上传的实现方法

    一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...

  8. 使用webuploader组件实现大文件分片上传,断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  9. 利用blob对象实现大文件分片上传

    首先说分片上传,我们在进行文件上传的时候,因为服务器的限制,会限制每一次上传到服务器的文件大小不会很大,这个时候我们就需要把一个需要上传的文件进行切割,然后分别进行上传到服务器. 假如需要做到这一步, ...

随机推荐

  1. Sublime Text 皮肤插件安装

    安装皮肤, 举例sodahttps://github.com/buymeasoda/soda-themectrl+shift+p => Package Control: Install Pack ...

  2. mysql锁死的现象判断

    一般发生表锁死这种低级问题,就有两种情况:1.程序员水平太菜,2.程序逻辑错误. 一旦发生系统会出现超时,关键是有可能你看不到正在活动的php进程,而系统的慢查询日志也不会记录,只能通过show fu ...

  3. null和undefined的区别

    不同之处: null是js语言的关键字,它表示一个特殊值,常用来描述“空值”.对null执行typeof运算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非 ...

  4. 自定义复选框 checkbox 样式

    默认的复选框样式一般在项目中都很少用 ,看起来也丑丑的.这里提供一个优化样式后的复选框.原理就是隐藏掉默认样式,在用设计好的样式替代 html结构 <div> <input type ...

  5. js浏览器键盘事件控制(转自新浪微博)

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  6. ASP.NET页面跳转的三种方法比较

    在ASP.NET下,经常需要在页面之间跳转,下面我们来分别介绍一下关于.NET中Response.Redirect(),Sever.Execute(),Server.Transfer() 三种页面跳转 ...

  7. js实现placeholder效果

    <form name="testForm" action="" method=""> <input type=" ...

  8. 在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步

    在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步 下载安装 vscode-ftp-sync 插件. 安装方法1. Ctrl+Shift+P 输入 ext install [插件 ...

  9. C#接收post数据

    private string PostInput() { try { System.IO.Stream s=Request.InputStream; ; ]; StringBuilder builde ...

  10. 分页插件jquery.simplePagination.js使用

    利用ecshop后台,利用插件更改分页显示样式遇到的问题,由于是利用Ajax获取数据进行页面数据更新?所以出现了以下情况: 初始化页面前 : 分页更新后: 点击后出现了分页插件内容消失, 原因:分页一 ...