============问题描述============

小弟初学安卓开发。最近需要做一个图片上传的功能。
我是用java开发安卓,调用C#的WebService。在网上找到一大堆资料,几乎全部是用ksoap2包的。
请注意,我想做的是不用ksoap包的。
我现在的方法是从android端用读取到要上传的图片,用Base64编码成字节流的字符串,通过调用webservice把该字符串作为参数传到服务器端,服务端解码该字符串,最后保存到相应的路径下。整个上传过程的关键就是以字节流的字符串进行数据传递。
功能代码如下:

WebService:

public string uploadImage(string filename, string image){FileStream fs = null;try{string toDir = "E:\\C# Project\\Dev\\GPRSDataIn\\GPRSDataIn\\Images";fs = new FileStream(filename, FileMode.Create);byte[] buffer = Encoding.UTF8.GetBytes(image);fs.Write(buffer, 0, buffer.Length);fs.Flush();fs.Close();return "上传图片成功!" + "图片路径为:" + toDir;}catch (Exception e){}return "上传图片失败!";}

安卓端:调用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);}}
public class HttpConnSoap {/*** 获取返回的InputStream,为了增强通用性,在方法内不对其进行解析。* * @param methodName*            webservice方法名* @param Parameters*            webservice方法对应的参数名* @param ParValues*            webservice方法中参数对应的值* @return 未解析的InputStream*/public InputStream GetWebServre(String methodName, ArrayList<String> Parameters, ArrayList<String> ParValues) {// 指定URL地址,我这里使用的是常量。String ServerUrl = "http://www.bsri.com.cn:99/ws3/Service1.asmx";// soapAction = 命名空间 + 方法名String soapAction = "http://tempuri.org/" + methodName;// 拼凑requestDataString soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+ "<soap:Body />";String tps,vps,ts;String mreakString = "";mreakString = "<" + methodName + " xmlns=\"http://tempuri.org/\">";for (int i = 0; i < Parameters.size(); i++){tps = Parameters.get (i).toString();//设置该方法的参数为.net webService中的参数名称vps = ParValues.get (i).toString();ts = new String("<" + tps + ">" + vps + "</" + tps + ">");mreakString = mreakString + ts;}mreakString = mreakString + "</" + methodName + ">";String soap2 = "</soap:Envelope>";String requestData = soap + mreakString + soap2;// 其上所有的数据都是在拼凑requestData,即向服务器发送的数据try {URL url = new URL(ServerUrl); // 指定服务器地址HttpURLConnection con = (HttpURLConnection) url.openConnection();// 打开链接byte[] bytes = requestData.getBytes("utf-8"); // 指定编码格式,可以解决中文乱码问题con.setDoInput(true); // 指定该链接是否可以输入con.setDoOutput(true); // 指定该链接是否可以输出con.setUseCaches(false); // 指定该链接是否只用cachescon.setConnectTimeout(6000); // 设置超时时间con.setRequestMethod("POST"); // 指定发送方法名,包括Post和Get。con.setRequestProperty("Content-Type", "text/xml;charset=utf-8"); // 设置(发送的)内容类型con.setRequestProperty("SOAPAction", soapAction); // 指定soapActioncon.setRequestProperty("Content-Length", "" + bytes.length); // 指定内容长度// 发送数据OutputStream outStream = con.getOutputStream();outStream.write(bytes);outStream.flush();outStream.close();// 获取数据// con.connect();BufferedInputStream ois = new BufferedInputStream(con.getInputStream());byte[] revBytes = new byte[20480];ois.read(revBytes);//InputStream inputStream = new ByteArrayInputStream(revBytes);String s = new String(revBytes);String newS = s.replaceAll("&lt;", "<");String newS1 = newS.replaceAll("&gt;", ">");ByteArrayInputStream bais = new ByteArrayInputStream(newS1.getBytes());return bais;} catch (Exception e) {e.printStackTrace();return null;}}}

触发上传方法:

@Overridepublic 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;}}@Overrideprotected 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============

   void submieGson(String users){try {HttpClient httpClient = new DefaultHttpClient();HttpPost httppost = new HttpPost("http://*/jsonws/frank/ftocservice/getUserInfo");List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();nameValuePairs.add(new BasicNameValuePair("users", users));nameValuePairs.add(new BasicNameValuePair("file", getFileString()));httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));HttpResponse response = httpClient.execute(httppost);System.out.println("rescode ="+response.getStatusLine().getStatusCode());if (response.getStatusLine().getStatusCode() == 200) {String str = EntityUtils.toString(response.getEntity(),"utf-8");System.out.println("json ========"+str);Message msg = Message.obtain();msg.obj = str;mHandler.sendMessage(msg);}} catch (Exception e) {e.printStackTrace();}}
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进行提交

转载于:https://www.cnblogs.com/yiguobei99/p/4035828.html

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

  1. .NET调用JAVA的WebService方法

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料, ...

  2. php 如何利用 soap调用.Net的WebService asmx文件

    原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...

  3. 设置maxJsonLength,解决ajax通过POST方式调用.net的webService时,数据过长时服务器返回500错误的问题

    设置maxJsonLength,解决ajax通过POST方式调用.net的webService时,数据过长时服务器返回500错误的问题 参考文章: (1)设置maxJsonLength,解决ajax通 ...

  4. ScriptManager调用 无参数WebService

    在工程中添加一个 webservice 使用默认的 红色部分为后添加 为了要让ScriptManager识别这个WEBSERVICE WebService.cs using System; using ...

  5. axis2 java.net.url_axis,axis2调用.net的webservice

    package testClick.src.test;import javax.xml.namespace.QName;import org.apache.axiom.om.OMAbstractFac ...

  6. java调用第三方的webservice应用实例

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示. 一些常用的webservice网站的链接地址: ...

  7. php调用.net webservice,PHP调用.NET的WebService 简单实例

    这篇文章主要介绍了使用PHP调用.NET的WebService的一个简单实例,十分的简单,有需要的小伙伴可以自己扩展下,如有疑问请留言. 创建一个C#的web service,这个就不多说了,我用vs ...

  8. jQuery Ajax 方法调用 Asp.Net WebService 的详细例子

    这很常用,搜索了一下博客园的"找找看"和谷歌,看到大部分都是转载于一两篇文章(而且来源还不是博客园),有的是简单的说一点无法运行,给初学者的调试和学习带来不方便,我在这里将jQue ...

  9. php soap调用asp.net webservice

    php soap调用asp.net webservice 原文:php soap调用asp.net webservice 首先做一下准备工作,找到安装环境里的php.ini把;extension=ph ...

最新文章

  1. HTML文本应当存储为UTF-8无BOM格式!
  2. 如何使用markdown编辑器?官方文档在此
  3. cpu模拟器c语言实现_你写出来的C语言是这样调用硬件的!
  4. GeneralUpdate20220323里程碑版本发布
  5. 朝花夕拾——finally/final/finalize拨云雾见青天
  6. 昆明理工大学c语言设计大作业,昆明理工大学大一C语言大作业题目
  7. 百万数据php7取出循环_用php处理百万级以上的数据
  8. centos7(linux)使用心得
  9. 检查Mysql引擎的方法
  10. c2000 电阻采样_采样电阻规范阻值表
  11. 字符串和数组的长度 java c++
  12. Socks代理是什么意思
  13. keystone中Vertify operation出现:No handlers could be found for logger keystoneclient.httpclient的问题
  14. 将文件从本机上传到虚拟机中Linux系统中的几种方法
  15. 使用VisualSFM和Meshlab实现三维重建过程
  16. mac上配置SVN版本回退
  17. 2014年辛星jquery解读第一节
  18. mysql查询每门功课成绩最好的前两名_用一个SQL查询语句得出每门功课成绩最好的前两名 - SQL Server论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  19. 范围变更管控案例_项目管理案例讨论“如何有效开展项目变更管理”
  20. 环保监测设备 环保监测智能终端 环保数采仪

热门文章

  1. 四位共阳极数码管显示函数_Verilog笔记
  2. python反转列表不用切片,在Python中反转切片
  3. 【必看】这6个吓人的Linux命令,你用过吗?
  4. 【技术】一个由于时间问题引发的血案
  5. 1.13 南京站 | 2022 开年 Serverless 沉浸式技术实践营开始报名
  6. OpenKruise v0.7.0 版本发布:新增周期任务分发控制器
  7. 由于超出容量限制_限制特高压系统中的过电压措施
  8. 计算机应用基础2010一级,2010年一级结构基础辅导:(计算机应用基础)备考讲义(10)...
  9. pythonos pathjson_Python Json数据文件操作原理解析
  10. sql优化常用的几种方法_MySQL常用30种SQL查询语句优化方法