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下大文件分割上传,布布扣,bubuko.com

时间: 2024-10-20 00:20:25

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

js大文件分割上传

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <title>分割大文件上传<

大文件分片上传

Vue项目中遇到了大文件分片上传的问题,之前用过webuploader,索性就把Vue2.0与webuploader结合起来使用,封装了一个vue的上传组件,使用起来也比较舒爽. 上传就上传吧,为什么搞得那么麻烦,用分片上传? 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度.当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度. 实现后的界面: 主要是两个文件,封装的上传组件和具体的ui页面,上传组件代码下面有列出来.

java大文件分片上传插件

我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能够上传 支持文件夹的上传,要求服务端能够保留层级结构,并且能够续传.需要支持10万个以上的文件夹上传. 支持低版本的系统和浏览器,因为这个项目

PHP实现大文件的上传设置

打开php.ini,首先找到 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; 区域,有影响文件上传的以下几个参数: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指 打开php.ini,首先找到;;;;;;;;;;;;;;;;; File Uploads ;;;;;;;;;;;;;;;;;区域,有影响文件上传的以下几个参数

Ajax实现大文件切割上传

Ajax大文件切割上传 2015-02-07 前面我们已经实现了Ajax的文件上传,不过会受限于服务器的允许的大小, 如果服务器并非自己的,我们就要使用Ajax大文件切割来实现上传. 首先解决Ajax跨域上传问题: 在HTML5中,ajax的跨域有了新的规则-----能否跨域取决于对应的应答. 对方服务器如果愿意接受远程过来的ajax,或某几个域名过来的ajax请求,可以在头信息header中,加入Access-Control-Allow-Origin * 在PHP中加入此信息,就可以实现跨域请

iOS大文件分片上传和断点续传

总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传.所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理.断点续

Ajax大文件切割上传

1问:在不更改php.ini中post_max_size的情况下怎么实现大文件的上? 答把大文件切割成许多小块,分块上传,传完后,重新合并成大文件即可. 2问:怎么切割? 答:用html5中的file API,这个API继承自Blob对象,Blob中有slice方法,可以截取二进制对象的一部分,实现切割大文件的效果. 3问:具体思路呢? 答:截取10M上传,判断是否截取完毕 while 还有数据{ 截取, Ajax上传 } 1 <script type="text/javascript&q

大文件分片上传,断点续传,秒传 实现

前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽弃: 解决方案: 1,修改服务端上传的限制配置:Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好: 2,大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分

网页 大文件分片上传处理

总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传.所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理.断点续