由于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;

}

文件转为string字符串参考:

http://blog.csdn.net/jdsjlzx/article/details/51194719

用HttpUrlConnection模拟post表单进行文件上传平时很少使用,比较麻烦。

原理是: 分析文件上传的数据格式,然后根据格式构造相应的发送给服务器的字符串。

格式如下:这里的httppost123是我自己构造的字符串,可以是其他任何的字符串

----------httppost123 (\r\n)

Content-Disposition: form-data; name="img"; filename="t.txt" (\r\n)

Content-Type: application/octet-stream (\r\n)

(\r\n)

sdfsdfsdfsdfsdf (\r\n)

----------httppost123 (\r\n)

Content-Disposition: form-data; name="text" (\r\n)

(\r\n)

text tttt (\r\n)

----------httppost123-- (\r\n)

(\r\n)

上面的(\r\n)表示各个数据必须以(\r\n)结尾。

具体Java代码如下:

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.SocketTimeoutException;

import java.net.URL;

import java.net.URLEncoder;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import javax.imageio.ImageIO;

import javax.imageio.ImageReader;

import javax.imageio.stream.ImageInputStream;

public

class HttpPostUtil{

URL url;

HttpURLConnection conn;

String boundary =

"--------httppost123";

Map textParams =

new HashMap();

Map fileparams =

new HashMap();

DataOutputStream ds;

public HttpPostUtil(String url) throws Exception{

this.url =

new URL(url);

}

//重新设置要请求的服务器地址,即上传文件的地址。

public void setUrl(String url) throws Exception{

this.url =

new URL(url);

}

//增加一个普通字符串数据到form表单数据中

public void addTextParameter(String name, String value){

textParams.put(name, value);

}

//增加一个文件到form表单数据中

public void addFileParameter(String name, File value){

fileparams.put(name, value);

}

// 清空所有已添加的form表单数据

public void clearAllParameters(){

textParams.clear();

fileparams.clear();

}

// 发送数据到服务器,返回一个字节包含服务器的返回结果的数组

public

byte[] send()

throws Exception {

initConnection();

try {

conn.connect();

}

catch (SocketTimeoutException e) {

// something

throw

new RuntimeException();

}

ds =

new DataOutputStream(conn.getOutputStream());

writeFileParams();

writeStringParams();

paramsEnd();

InputStream in = conn.getInputStream();

ByteArrayOutputStream out =

new ByteArrayOutputStream();

int b;

while ((b = in.read()) != -

1) {

out.write(b);

}

conn.disconnect();

return out.toByteArray();

}

//文件上传的connection的一些必须设置

private void initConnection() throws Exception{

conn = (HttpURLConnection)

this.url.openConnection();

conn.setDoOutput(

true);

conn.setUseCaches(

false);

conn.setConnectTimeout(

10000);

//连接超时为10秒

conn.setRequestMethod(

"POST");

conn.setRequestProperty(

"Content-Type",

"multipart/form-data; boundary=" + boundary);

}

//普通字符串数据

private void writeStringParams() throws Exception{

Set keySet = textParams.keySet();

for (Iterator it = keySet.iterator(); it.hasNext();) {

String name = it.next();

String value = textParams.get(name);

ds.writeBytes(

"--" + boundary +

"\r\n");

ds.writeBytes(

"Content-Disposition: form-data; name=\"" + name

+

"\"\r\n");

ds.writeBytes(

"\r\n");

ds.writeBytes(encode(value) +

"\r\n");

}

}

//文件数据

private void writeFileParams() throws Exception{

Set keySet = fileparams.keySet();

for (Iterator it = keySet.iterator(); it.hasNext();) {

String name = it.next();

File value = fileparams.get(name);

ds.writeBytes(

"--" + boundary +

"\r\n");

ds.writeBytes(

"Content-Disposition: form-data; name=\"" + name

+

"\"; filename=\"" + encode(value.getName()) +

"\"\r\n");

ds.writeBytes(

"Content-Type: " + getContentType(value) +

"\r\n");

ds.writeBytes(

"\r\n");

ds.write(getBytes(value));

ds.writeBytes(

"\r\n");

}

}

//获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream

private String getContentType(File f) throws Exception{

//return "application/octet-stream"; // 此行不再细分是否为图片,全部作为application/octet-stream 类型

ImageInputStream imagein = ImageIO.createImageInputStream(f);

if (imagein ==

null) {

return

"application/octet-stream";

}

Iterator it = ImageIO.getImageReaders(imagein);

if (!it.hasNext()) {

imagein.close();

return

"application/octet-stream";

}

imagein.close();

return

"image/" + it.next().getFormatName().toLowerCase();

//将FormatName返回的值转换成小写,默认为大写

}

//把文件转换成字节数组

private

byte[] getBytes(File f)

throws Exception {

FileInputStream in =

new FileInputStream(f);

ByteArrayOutputStream out =

new ByteArrayOutputStream();

byte[] b =

new

byte[

1024];

int n;

while ((n = in.read(b)) != -

1) {

out.write(b,

0, n);

}

in.close();

return out.toByteArray();

}

//添加结尾数据

private void paramsEnd() throws Exception{

ds.writeBytes(

"--" + boundary +

"--" +

"\r\n");

ds.writeBytes(

"\r\n");

}

// 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码

private String encode(String value) throws Exception{

return URLEncoder.encode(value,

"UTF-8");

}

public static void main(String[] args) throws Exception{

HttpPostUtil u =

new HttpPostUtil(

"http://localhost:3000/up_load");

u.addFileParameter(

"img",

new File(

"D:\\素材\\圆月.jpg"));

u.addTextParameter(

"text",

"中文");

byte[] b = u.send();

String result =

new String(b);

System.out.println(result);

}

}

如果不把中文转成UTF-8的格式进行传输,则后台显示中文乱码。

同样,如果其他参数包含中文,则也应当先转码。

当然,具体什么编码要和后台接收的编码一致。

android 大图 分块,android 大文件分割上传(分块上传)相关推荐

  1. android培训之android下大文件分割上传(摘自达内总部)

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

  2. PHP上传大文件 分割文件上传

    PHP上传大文件 分割文件上传 PHP上传大文件 分割文件上传 作者:Eamonn 发布时间:2012-03-24 14:49 访问:523 分类:PHP & Mysql 最近遇到这么个情况, ...

  3. 数据处理:1 用pandas处理大型csv文件 2 使用Pandas分块处理大文件 3 分块读取

    在训练机器学习模型的过程中,源数据常常不符合我们的要求.大量繁杂的数据,需要按照我们的需求进行过滤.拿到我们想要的数据格式,并建立能够反映数据间逻辑结构的数据表达形式.  最近就拿到一个小任务,需要处 ...

  4. 大文件传输解决方案:分片上传 / 下载限速

    前言 不少项目中会遇到上传下载视频.更新包.应用程序等文件,此类文件的共同点就是十分巨大,我在项目中遇到过 4G 左右的文件同时 100 多台机器下载,此时如果用 post 上传和下载想一下都不可能, ...

  5. c语言 拆分 文件,linux 将一个大文件分割成小的碎片文件 命令:csplit

    csplit命令用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件.碎片文件的命名类似"xx00","xx01".csplit命令是split ...

  6. linux大文件分割 split命令

    原文地址为: linux大文件分割 split命令 inux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-<行数>][-b < ...

  7. android wear gear2,开发大神实现三星Gear 2上启动Android Wear

    原标题:开发大神实现三星Gear 2上启动Android Wear 安珀网(公众号:ianpocom) 三星希望打造自己的Tizen OS智能手表生态系统.在三星的智能手表中,运行Android We ...

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

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

  9. JS 大文件分割上传

    js分片上传大文件,前端代码 首先导入jQuery.form.js文件,下面src是相对于改js文件位置, <script type="text/JavaScript" sr ...

最新文章

  1. Redis数据介绍与指令大全
  2. 反其道而行:教人写烂代码的开源项目
  3. IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream...
  4. VTK:Utilities之ShepardMethod
  5. c语言聊天程序socket,今天打的代码。基于TCP的聊天程序。
  6. websocket 西部数码php_网页实时聊天之PHP实现websocket
  7. 【渝粤教育】电大中专跨境电子商务理论与实务 (20)作业 题库
  8. npm 缓存_npm缓存:无名英雄
  9. STL之修改集合里边元素的顺序
  10. Bailian2786 Pell数列【数列】(POJ NOI0102-1788,POJ NOI0103-1788)
  11. 微机综合保护装置怎么选择?在高压柜中起什么作用?
  12. 生物信息学常用数据库
  13. 几何实体图形保存成stl格式的ascII和二进制文。用Vc++语言读入文件,给三角网格坐标值乘以2,并保存到另一stl文件。输出完成工作所用的执行时间
  14. 标题怎样选择适合自己的导图结构
  15. 企业管理者谦虚_为什么谦虚是优秀开发者最重要的特征
  16. 6-4 计算圆柱体的表面积(函数名隐藏)
  17. cout 和cerr的区别
  18. cad画不规则实体_cad画不规则曲线的方法步骤图
  19. 数据结构图,图存储结构详解
  20. COSCon'22 开源商业论坛 | 刘天栋:从社区参与到开源商业化

热门文章

  1. IDEA如何添加项目启动参数
  2. JDBC PreparedStatement
  3. this super 解释
  4. ubuntu 12.04陷入software center的searching/cancelling...
  5. ASP.NET自动回发的内幕
  6. php中ASCⅡ码的妙用
  7. 这个春天我能感觉的到
  8. AspNetForum 论坛整改:添加显IP功能及IP所属地
  9. EasyPR中文车牌识别系统开发
  10. 启动root用户 银河麒麟_银河麒麟Kydroid 2.0全新发布:原生支持海量安卓APP