您的位置:首页 > 编程语言 > C#

关于安卓调用C#的WebService上传图片问题(不使用ksoap2)

2014-11-08 13:47 609 查看
============问题描述============

小弟初学安卓开发。最近需要做一个图片上传的功能。

我是用java开发安卓,调用C#的WebService。在网上找到一大堆资料,几乎全部是用ksoap2包的。

请注意,我想做的是不用ksoap包的。

我现在的方法是从android端用读取到要上传的图片,用Base64编码成字节流的字符串,通过调用webservice把该字符串作为参数传到服务器端,服务端解码该字符串,最后保存到相应的路径下。整个上传过程的关键就是以字节流的字符串进行数据传递。

功能代码如下:

WebService:

安卓端:调用WebService方法

public class UploadUtil {

private static HttpConnSoap Soap = new HttpConnSoap();

public static void uploadImage(String filename, String image) {

ArrayList<String>arrayList=new ArrayList<String>();

ArrayList<String>brrayList=new ArrayList<String>();

arrayList.clear();

brrayList.clear();

arrayList.add("filename");

arrayList.add("image");

brrayList.add(filename);

brrayList.add(image);

Soap.GetWebServre("uploadImage", arrayList, brrayList);

}

}



触发上传方法:

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.selectImage:

/*** * 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的 */

Intent intent = new Intent();

intent.setType("image/*");

intent.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(intent, 1);

break;

case R.id.uploadImage:

if (picPath == null) {

Toast.makeText(Upload.this, "请选择图片!", 1000).show();

} else {

final File file = new File(picPath);

if (file != null) {

UploadUtil.uploadImage(imgName, photodata);

}

}

break;

default:

break;

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == Activity.RESULT_OK) {

/** * 当选择的图片不为空的话,在获取到图片的途径 */

Uri uri = data.getData();

try {

Cursor cursor = getContentResolver().query(uri, null, null,

null, null);

if (cursor != null) {

ContentResolver cr = this.getContentResolver();

cursor.moveToFirst();

String path = cursor.getString(1); // 图片文件路径

imgName = cursor.getString(3); // 图片文件名

if (path.endsWith("jpg") || path.endsWith("png")) {

picPath = path;

Bitmap bitmap = BitmapFactory.decodeStream(cr

.openInputStream(uri));

imageView.setImageBitmap(bitmap);

FileInputStream fis = new FileInputStream(path);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[20480];

int count = 0;

while ((count = fis.read(buffer)) >= 0) {

baos.write(buffer, 0, count);

}

byte[] bytes = baos.toByteArray();

photodata = Base64

.encodeToString(bytes, Base64.DEFAULT);

} else {

alert();

}

} else {

alert();

}

} catch (Exception e) {

}

}

super.onActivityResult(requestCode, resultCode, data);

}


我感觉理论上是没有什么问题的,但是实际上,执行到调用WebService的时候,拼接请求时, ts = new String("<" + tps + ">" + vps + "</" + tps + ">");这里可能是图片转base64编码的String串长度太长,导致内存溢出。

如何解决,望各位大神指教!或者程序有什么错还请大神们指出,或者教我用合适的方法。小弟分不多,还请见谅。

============解决方案1============


String getFileString() {

String fileStream = null;

FileInputStream fis;

try {

fis = new FileInputStream(Environment.getExternalStorageDirectory()

.getPath() + "/QuickCheck/image/temp.png");

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int count = 0;

while ((count = fis.read(buffer)) >= 0) {

baos.write(buffer, 0, count);

}

fis.close();

fileStream = new String(Base64.encode(baos.toByteArray(),

Base64.DEFAULT)); // 进行Base64编码

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return fileStream;

}


使用post进行提交
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: