使用.NET框架、Web service实现Android的文件上传(一)
上面是上传结果的展示,下面具体讲一下实现过程。
一、Web Service (.NET)
- namespace VedioPlayerWebService.service.vedios
- {
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolboxItem(false)]
- [System.Web.Script.Services.ScriptService]
- [SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]
- public class GetVedios : System.Web.Services.WebService
- {
- [WebMethod(EnableSession = true, Description = "上传文件")]
- public int FileUploadByBase64String(string base64string, string fileName1)
- {
- try
- {
- string fileName = "D:\\VedioPlayerWeb\\videos\\" + fileName1;
- // 取得文件夹
- string dir = fileName.Substring(0, fileName.LastIndexOf("\\"));
- //如果不存在文件夹,就创建文件夹
- if (!Directory.Exists(dir))
- Directory.CreateDirectory(dir);
- byte[] bytes = Convert.FromBase64String(base64string);
- MemoryStream memoryStream = new MemoryStream(bytes, 0, bytes.Length);
- memoryStream.Write(bytes, 0, bytes.Length);
- // 写入文件
- File.WriteAllBytes(fileName, memoryStream.ToArray());
- if (File.Exists(fileName))
- {
- FileStream fsSource = new FileStream(fileName, FileMode.Open, FileAccess.Read);
- fsSource.Close();
- }
- //返回数据如果是1,上传成功!
- return 1;
- }
- catch (Exception ex)
- {
- //返回如果是-1,上传失败
- return -1;
- }
- }
- }
- }
二、工具类(Android)
1、将要上传的文件转换成经过处理的Base64字符串
- /**
- *得到经过处理的Base64字符串
- * Created by WFZ on 2015/12/7.
- */
- public class Base64Util {
- public static String getBase64String(String path) {
- byte[] byteArray = null;
- byteArray = Fileutil.readFileToByteArray(new File(path));
- String strBase64 = new String(Base64.encode(byteArray,0));
- return strBase64;
- }
- }
2、读取文件的工具类
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- /**
- * 读取文件的工具类
- * Created by WFZ on 2015/12/7.
- */
- public class Fileutil {
- public static byte[] readFileToByteArray(File file) {
- FileInputStream fileInputStream = null;
- ByteArrayOutputStream byteArrayOutputStream = null;
- try {
- fileInputStream = new FileInputStream(file);
- byteArrayOutputStream = new ByteArrayOutputStream();
- byte[] bt = new byte[1024];
- int len = 0;
- while ((len = fileInputStream.read(bt)) != -1) {
- byteArrayOutputStream.write(bt, 0, len);
- }
- return byteArrayOutputStream.toByteArray();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if (fileInputStream != null) {
- try {
- fileInputStream.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if (byteArrayOutputStream != null) {
- try {
- byteArrayOutputStream.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return null;
- }
- }
3、上传文件的工具类,这里需要soap的jar包
- import org.ksoap2.SoapEnvelope;
- import org.ksoap2.serialization.SoapObject;
- import org.ksoap2.serialization.SoapSerializationEnvelope;
- import org.ksoap2.transport.HttpTransportSE;
- /**
- *
- * Created by WFZ on 2015/12/7.
- */
- public class QueryUploadUtil {
- private String filename, base64string;
- public QueryUploadUtil(String base64str, String fileName) {
- this.filename = fileName;
- this.base64string = base64str;
- }
- // 需要实现Callable的Call方法
- public String call(String wsdl,String url) throws Exception {
- String str = "上传失败";
- // TODO Auto-generated method stub
- try {
- //创建SoapObject对象,并指定WebService的命名空间和调用的方法名
- SoapObject rpc = new SoapObject("http://tempuri.org/",
- "FileUploadByBase64String");
- //设置WebService方法的参数
- rpc.addProperty("base64string", base64string);
- rpc.addProperty("fileName1", filename);
- //第3步:创建SoapSerializationEnvelope对象,并指定WebService的版本
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- // 设置bodyOut属性
- envelope.bodyOut = rpc;
- envelope.dotNet = true;
- envelope.setOutputSoapObject(rpc);
- //创建HttpTransportSE对象,并指定WSDL文档的URL
- /**
- * 创建WSDL文档有三种方法:
- * 在.NET中有三种方式生成WSDL:
- * 1.在Web Service的URL后面加上WDSL需求,如下:
- * http://localhost/webExamples/simpleService.asmx?WSDL
- * 2.使用disco.exe。在命令行中写下如下的命令:
- * disco http://localhost/webExamples/simpleService.asmx
- *3.使用System.Web.Services.Description命名空间下提供的类
- * */
- HttpTransportSE ht = new HttpTransportSE(wsdl);
- ht.debug = false;
- //调用WebService
- ht.call(url, envelope);
- //使用getResponse方法获得WebService方法的返回结果
- String result = String.valueOf(envelope.getResponse());
- //这个地方是我自己设置的从webservice返回的结果,“1”表示上传成功。
- if (result.toString().equals("1"))
- str = "上传成功";
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- str = "上传错误";
- }
- return str;
- }
- }
三、布局文件
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity">
- <TextView
- android:id="@+id/tv1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/tv2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/btn"
- android:layout_width="match_parent"
- android:text="上传"
- android:layout_height="wrap_content" />
- <ImageView
- android:id="@+id/iv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/tv3"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
四、MainActivity文件
- import android.content.DialogInterface;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.Handler;
- import android.os.Message;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- import com.lhgj.wfz.uploadfiles.utils.Base64Util;
- import com.lhgj.wfz.uploadfiles.utils.Fileutil;
- import com.lhgj.wfz.uploadfiles.utils.QueryUploadUtil;
- import java.io.File;
- public class MainActivity extends AppCompatActivity {
- private TextView tv1 = null;//上传的文件地址
- private TextView tv2 = null;//上传的文件名称
- private TextView tv3 = null;//上传是否成功提示
- private Button btn = null;//上传按钮
- private ImageView img = null;//图片
- private String filePath="/data/data/com.lhgj.wfz.uploadfiles/";//手机中文件存储的位置
- private String fileName ="temp.jpg";//上传的图片
- private String wsdl ="http://192.168.15.4:1122/service/vedios/GetVedios.asmx?WSDL";//WSDL
- private String url ="http://192.168.15.4:1122/service/vedios/GetVedios.asmx/FileUploadByBase64String";//与webservice交互的地址
- /**
- * 由于上传文件是一个耗时操作,需要开一个异步,这里我们使用handle
- * */
- private Handler handler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- String string = (String) msg.obj;
- Toast.makeText(MainActivity.this, string, Toast.LENGTH_LONG).show();;
- tv3.setText(string);
- };
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
- /**
- * 初始化view
- * */
- private void initView(){
- tv1 = (TextView) findViewById(R.id.tv1);
- tv2 = (TextView) findViewById(R.id.tv2);
- tv3 = (TextView) findViewById(R.id.tv3);
- btn = (Button) findViewById(R.id.btn);
- img = (ImageView) findViewById(R.id.iv);
- //设置显示的图片
- byte[] byteArray = null;
- byteArray = Fileutil.readFileToByteArray(new File(filePath+fileName));
- Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
- byteArray.length);
- img.setImageBitmap(bitmap);
- //设置显示的文本
- tv1.setText("文件位置:" + filePath);
- tv2.setText("文件名称" + fileName);
- btn.setOnClickListener(new BtnOnclickListener());
- }
- /**
- * ImageView的事件响应
- * */
- private class BtnOnclickListener implements View.OnClickListener{
- @Override
- public void onClick(View v) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- Message message = Message.obtain();
- String result="";
- try {
- QueryUploadUtil quu = new QueryUploadUtil(Base64Util.getBase64String(filePath+fileName), "temp.png");
- result= quu.call(wsdl,wsdl);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- message.obj=result;
- handler.sendMessage(message);
- }
- }).start();
- }
- }
- }
可以去我的github上下载Demo,两个文件:一个Android客户端,一个服务端。下载地址:https://github.com/weifengzz/UploadFile_1
使用.NET框架、Web service实现Android的文件上传(一)的更多相关文章
- 使用.NET框架、Web service实现Android的文件上传(二)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYUAAAKpCAIAAADcx6fPAAAgAElEQVR4nOydd1hT5+LHg1attbfr1t ...
- Android OkHttp文件上传与下载的进度监听扩展
http://www.loongwind.com/archives/290.html 上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时 ...
- Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区
Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区 Kindeditor+web.py+SAE Storage 实现文件上传
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- SSM + Android 网络文件上传下载
SSM + Android 网络交互的那些事 2016年12月14日 17:58:36 ssm做为后台与android交互,相信只要是了解过的人都知道一些基本的数据交互,向json,对象,map的交互 ...
- android批量文件上传(android批量图片上传)
项目中多处用到文件批量上传功能,今天正好解决了此问题,在此写出来,以便日后借鉴. 首先,以下架构下的批量文件上传可能会失败或者不会成功: 1.android客户端+springMVC服务端:服务端 ...
- Android 实现文件上传功能(upload)
文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...
- SSM框架之SpringMVC(5)文件上传
SpringMVC(5)文件上传 1.实现文件上传的前期准备 1.1.文件上传的必要前提 A form 表单的 enctype 取值必须是: multipart/form-data(默认值是:appl ...
随机推荐
- ul li span addClass removeClass
<link type="text/css" href="./style/css/base.css" rel="stylesheet"& ...
- Dom4j 添加 / 更新 / 删除 XML
1.获得文档 /** *1.获得解析流 *2.解析XML */ 2.添加 /** *1.获取父元素 *2.创建元素 *3.创建属性并添加到元素中 *4.元素添加到根节点 */ 3.更新 /** *1. ...
- MFC 点击改变文本 加法计时器 伸缩窗体
1.添加所需控件,设置ID:labNum1,txtNum1.txtNum2.txtNum3.btnAdd,并将labNum1的属性Notify->true(控件在被单击或双击时可以发送消息) 2 ...
- 《Linux多线程服务器端编程》读书笔记第3章
<Linux多线程服务器端编程>第3章主要讲的是多线程服务器的适用场合与常用的编程模型. 1.进程和线程 一个进程是"内存中正在运行的程序“.每个进程都有自己独立的地址空间(ad ...
- uva 105 - The Skyline Problem
一.用数组储存该位置的最高点即可(图形的连续点离散化),注意左边界及右边界的情况: 注意:无论建筑物最左边是盖到哪里,你都得从1开始输出(输入输出都是integer,所以才能离散化): #includ ...
- 近期Responsive web design项目经验分享-高分辨率图片处理篇
在高分辨率的情况下 商品的图片难免会失真 怎样才能让商品的图片在高分辨率的情况下 效果不失真 提供用户更好的体验呢 我发现了一个解决方案 不知道是不是你想要的 先上图片对比下效果 左侧是使用后 ...
- java并发编程_基本模块构建
读<java并发编程实战>第五章学习记录:该章节主要介绍一些并发编程中一些基本的构建模块.如并发容器和并发工具类(闭锁和栅栏)以及一些需要注意的情况 并发容器 1. ConcurrentH ...
- Spring security oauth2最简单入门环境搭建
关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...
- 记录终端输出的LOG到文件
先要说明为什么要记录终端会话,因为常会遇到这样的情况,终端是有缓存大小限制的,当在终端打印的消息超出缓存范围,它前面的打印消息就自动丢失了,这对于我们调试程序会造成障碍,所以有记录完整终端打印消息的必 ...
- windows批处理命令教程
批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令 ...