android统计接受字节,android – 计算Base64编码文件的Post Content-Length的大小

我正在尝试将一些大型文件从

Android设备上传到.Net Web服务.此Web服务已设置为接受这些文件作为POST参数,并且文件必须作为Base64编码的字符串发送.

我已经能够使用Christian d’Heure的this库将文件转换为Base64字符串,以字节为单位计算字符串的大小并将其先前发送,但我之前使用的方法包括将整个文件加载到内存中.处理大文件时导致内存不足错误,这并不意外.

我一直在尝试将文件转换为块中的Base64并在转换时通过连接(使用数据输出流对象)传输此数据,因此整个文件不需要一次性加载到内存中,在转换文件之前,我似乎无法准确计算出请求的Content-Length的大小 – 我通常看起来大概是10个字节 – 令人沮丧的是,它偶尔会起作用!

我还发现,有些时候,这确实有效,服务器返回以下错误消息“Base64 char数组的大小无效”.我认为这是一个填充字符的问题,但是我看不出我的代码有问题,这个问题的一些建议将非常感谢!

这是生成请求并流式传输数据的代码:

try

{

HttpURLConnection connection = null;

DataOutputStream outputStream = null;

DataInputStream inputStream = null;

//This is the path to the file

String pathToOurFile = Environment

.getExternalStorageDirectory().getPath()

+ "/path/to/the/file.zip";

String urlServer = "https://www.someserver.com/somewebservice/";

int bytesRead, bytesAvailable, bufferSize;

byte[] buffer;

int maxBufferSize = 456;

//The parameters of the POST request - File Data is the file in question as a Base64 String

String params = "Username=foo&Password=bar&FileData=";

File sizeCheck = new File(pathToOurFile);

Integer zipSize = (int) sizeCheck.length();

Integer paddingRequired = ((zipSize * 8) / 6) % 3;

Integer base64ZipSize = ((zipSize * 8) / 6)

+ ((zipSize * 8) / 6) % 3;

Integer paramLength = params.getBytes().length;

//Code to work out the number of lines required, assuming we create a new

//line every 76 characters - this is used t work out the number of

//extra bytes required for new line characters

Integer numberOfLines = base64ZipSize / 76;

Log.i(TAG, "numberOfLines: " + numberOfLines);

Integer newLineLength = System.getProperty("line.separator")

.getBytes().length;

//This works out the total length of the Content

Integer totalLength = paramLength + base64ZipSize

+ (numberOfLines * newLineLength) + paddingRequired;

Log.i(TAG, "total Length: " + totalLength);

FileInputStream fileInputStream = new FileInputStream(new File(

pathToOurFile));

URL url = new URL(urlServer);

connection = (HttpURLConnection) url.openConnection();

connection.setDoInput(true);

connection.setDoOutput(true);

connection.setUseCaches(false);

connection.setRequestMethod("POST");

connection.setRequestProperty("Connection", "Keep-Alive");

connection.setRequestProperty("Content-Type",

"application/x-www-form-urlencoded;");

connection.setRequestProperty("Content-Length", ""

+ totalLength); // number of bytes

outputStream = new DataOutputStream(

connection.getOutputStream());

//Write out the parameters to the data output stream

outputStream.writeBytes(params);

bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);

buffer = new byte[bufferSize];

bytesRead = fileInputStream.read(buffer, 0, bufferSize);

Integer totalSent = paramLength;

Integer enLen = 0;

//Convert the file to Base64 and Stream the result to the

//Data output stream

while (bytesRead > 0)

{

String convetedBase64 = Base64Coder.encodeLines(buffer);

convetedBase64 = convetedBase64.replace("=", "");

if (totalSent >= (totalLength - 616))

{

Log.i(TAG, "about to send last chunk of data");

convetedBase64 = convetedBase64.substring(0,

convetedBase64.length() - 1);

}

Log.i(TAG,

"next data chunk to send: "

+ convetedBase64.getBytes().length);

Log.i(TAG, "'" + convetedBase64 + "'");

enLen = enLen + convetedBase64.length();

outputStream.writeBytes(convetedBase64);

totalSent = totalSent + convetedBase64.getBytes().length;

Log.i(TAG, "total sent " + totalSent);

Log.i(TAG, "actual size: " + outputStream.size());

bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);

buffer = new byte[bufferSize];

bytesRead = fileInputStream.read(buffer, 0, bufferSize); // read

// into

// the

// buffer

}

Log.i(TAG, "enLen: " + enLen);

Log.i(TAG, "paddingRequired: " + paddingRequired);

for (int x = 0; x < paddingRequired; x++)

{

outputStream.writeBytes("=");

}

InputStream is2 = connection.getInputStream();

String output = IOUtils.toString(is2);

Log.i(TAG, "Got server response: " + output);

fileInputStream.close();

outputStream.flush();

outputStream.close();

}

catch (Exception ex)

{

Log.e(TAG, "caught an exception:" + ex.getMessage());

}

如果有人能指出我的代码中可能导致此错误的任何错误,或者建议更好的转换和上传文件的方式,我将非常感激.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值