zoukankan      html  css  js  c++  java
  • 使用.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字符串

     1 /**
     2  *得到经过处理的Base64字符串
     3  * Created by WFZ on 2015/12/7.
     4  */
     5 public class Base64Util {
     6     public static String getBase64String(String path) {
     7         byte[] byteArray = null;
     8         byteArray = Fileutil.readFileToByteArray(new File(path));
     9         String strBase64 = new String(Base64.encode(byteArray,0));
    10         return strBase64;
    11     }
    12 }

    2、读取文件的工具类

     1 import java.io.ByteArrayOutputStream;
     2 import java.io.File;
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.IOException;
     6 /**
     7  * 读取文件的工具类
     8  * Created by WFZ on 2015/12/7.
     9  */
    10 public class Fileutil {
    11     public static byte[] readFileToByteArray(File file) {
    12         FileInputStream fileInputStream = null;
    13         ByteArrayOutputStream byteArrayOutputStream = null;
    14         try {
    15             fileInputStream = new FileInputStream(file);
    16             byteArrayOutputStream = new ByteArrayOutputStream();
    17             byte[] bt = new byte[1024];
    18             int len = 0;
    19             while ((len = fileInputStream.read(bt)) != -1) {
    20                 byteArrayOutputStream.write(bt, 0, len);
    21             }
    22             return byteArrayOutputStream.toByteArray();
    23         } catch (FileNotFoundException e) {
    24             // TODO Auto-generated catch block
    25             e.printStackTrace();
    26         } catch (IOException e) {
    27             // TODO Auto-generated catch block
    28             e.printStackTrace();
    29         } finally {
    30             if (fileInputStream != null) {
    31                 try {
    32                     fileInputStream.close();
    33                 } catch (IOException e) {
    34                     // TODO Auto-generated catch block
    35                     e.printStackTrace();
    36                 }
    37             }
    38             if (byteArrayOutputStream != null) {
    39                 try {
    40                     byteArrayOutputStream.close();
    41                 } catch (IOException e) {
    42                     // TODO Auto-generated catch block
    43                     e.printStackTrace();
    44                 }
    45             }
    46         }
    47         return null;
    48     }
    49 }

    3、上传文件的工具类,这里需要soap的jar包

     1 import org.ksoap2.SoapEnvelope;
     2 import org.ksoap2.serialization.SoapObject;
     3 import org.ksoap2.serialization.SoapSerializationEnvelope;
     4 import org.ksoap2.transport.HttpTransportSE;
     5 
     6 /**
     7  *
     8  * Created by WFZ on 2015/12/7.
     9  */
    10 public class QueryUploadUtil {
    11     private String filename, base64string;
    12 
    13     public QueryUploadUtil(String base64str, String fileName) {
    14         this.filename = fileName;
    15         this.base64string = base64str;
    16     }
    17     // 需要实现Callable的Call方法
    18     public String call(String wsdl,String url) throws Exception {
    19         String str = "上传失败";
    20         // TODO Auto-generated method stub
    21         try {
    22             //创建SoapObject对象,并指定WebService的命名空间和调用的方法名
    23             SoapObject rpc = new SoapObject("http://tempuri.org/",
    24                     "FileUploadByBase64String");
    25             //设置WebService方法的参数
    26             rpc.addProperty("base64string", base64string);
    27             rpc.addProperty("fileName1", filename);
    28             //第3步:创建SoapSerializationEnvelope对象,并指定WebService的版本
    29             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    30                     SoapEnvelope.VER11);
    31             // 设置bodyOut属性
    32             envelope.bodyOut = rpc;
    33             envelope.dotNet = true;
    34             envelope.setOutputSoapObject(rpc);
    35             //创建HttpTransportSE对象,并指定WSDL文档的URL
    36             /**
    37              * 创建WSDL文档有三种方法:
    38              * 在.NET中有三种方式生成WSDL:
    39              * 1.在Web Service的URL后面加上WDSL需求,如下:
    40              *  http://localhost/webExamples/simpleService.asmx?WSDL
    41              * 2.使用disco.exe。在命令行中写下如下的命令:
    42              *  disco http://localhost/webExamples/simpleService.asmx
    43              *3.使用System.Web.Services.Description命名空间下提供的类
    44              * */
    45             HttpTransportSE ht = new HttpTransportSE(wsdl);
    46             ht.debug = false;
    47             //调用WebService
    48             ht.call(url, envelope);
    49             //使用getResponse方法获得WebService方法的返回结果
    50             String result = String.valueOf(envelope.getResponse());
    51             //这个地方是我自己设置的从webservice返回的结果,“1”表示上传成功。
    52             if (result.toString().equals("1"))
    53                 str = "上传成功";
    54         } catch (Exception e) {
    55             // TODO Auto-generated catch block
    56             e.printStackTrace();
    57             str = "上传错误";
    58         }
    59         return str;
    60     }
    61 }

    三、布局文件

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="vertical"
     5     tools:context=".MainActivity">
     6     <TextView
     7         android:id="@+id/tv1"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content" />
    10     <TextView
    11         android:id="@+id/tv2"
    12         android:layout_width="match_parent"
    13         android:layout_height="wrap_content" />
    14     <Button
    15         android:id="@+id/btn"
    16         android:layout_width="match_parent"
    17         android:text="上传"
    18         android:layout_height="wrap_content" />
    19     <ImageView
    20         android:id="@+id/iv"
    21         android:layout_width="wrap_content"
    22         android:layout_height="wrap_content" />
    23     <TextView
    24         android:id="@+id/tv3"
    25         android:layout_width="match_parent"
    26         android:layout_height="wrap_content" />
    27 </LinearLayout>

    四、MainActivity文件

      1 import android.content.DialogInterface;
      2 import android.graphics.Bitmap;
      3 import android.graphics.BitmapFactory;
      4 import android.os.Handler;
      5 import android.os.Message;
      6 import android.support.v7.app.AppCompatActivity;
      7 import android.os.Bundle;
      8 import android.view.Menu;
      9 import android.view.MenuItem;
     10 import android.view.View;
     11 import android.widget.Button;
     12 import android.widget.ImageView;
     13 import android.widget.TextView;
     14 import android.widget.Toast;
     15 
     16 import com.lhgj.wfz.uploadfiles.utils.Base64Util;
     17 import com.lhgj.wfz.uploadfiles.utils.Fileutil;
     18 import com.lhgj.wfz.uploadfiles.utils.QueryUploadUtil;
     19 
     20 import java.io.File;
     21 
     22 public class MainActivity extends AppCompatActivity {
     23     private TextView tv1 = null;//上传的文件地址
     24     private TextView tv2 = null;//上传的文件名称
     25     private TextView tv3 = null;//上传是否成功提示
     26     private Button btn = null;//上传按钮
     27     private ImageView img = null;//图片
     28     private  String filePath="/data/data/com.lhgj.wfz.uploadfiles/";//手机中文件存储的位置
     29     private String fileName ="temp.jpg";//上传的图片
     30     private String wsdl ="http://192.168.15.4:1122/service/vedios/GetVedios.asmx?WSDL";//WSDL
     31     private String url ="http://192.168.15.4:1122/service/vedios/GetVedios.asmx/FileUploadByBase64String";//与webservice交互的地址
     32 
     33     /**
     34      * 由于上传文件是一个耗时操作,需要开一个异步,这里我们使用handle
     35      * */
     36     private Handler handler = new Handler() {
     37         public void handleMessage(android.os.Message msg) {
     38             String string = (String) msg.obj;
     39             Toast.makeText(MainActivity.this, string, Toast.LENGTH_LONG).show();;
     40             tv3.setText(string);
     41         };
     42     };
     43 
     44     @Override
     45     protected void onCreate(Bundle savedInstanceState) {
     46         super.onCreate(savedInstanceState);
     47         setContentView(R.layout.activity_main);
     48         initView();
     49     }
     50 
     51     /**
     52      * 初始化view
     53      * */
     54     private void initView(){
     55         tv1 = (TextView) findViewById(R.id.tv1);
     56         tv2 = (TextView) findViewById(R.id.tv2);
     57         tv3 = (TextView) findViewById(R.id.tv3);
     58         btn = (Button) findViewById(R.id.btn);
     59         img = (ImageView) findViewById(R.id.iv);
     60 
     61         //设置显示的图片
     62         byte[] byteArray = null;
     63         byteArray = Fileutil.readFileToByteArray(new File(filePath+fileName));
     64         Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
     65                 byteArray.length);
     66         img.setImageBitmap(bitmap);
     67 
     68         //设置显示的文本
     69         tv1.setText("文件位置:" + filePath);
     70         tv2.setText("文件名称" + fileName);
     71 
     72         btn.setOnClickListener(new BtnOnclickListener());
     73     }
     74 
     75     /**
     76      * ImageView的事件响应
     77      * */
     78     private class BtnOnclickListener implements View.OnClickListener{
     79 
     80         @Override
     81         public void onClick(View v) {
     82             new Thread(new Runnable() {
     83 
     84                 @Override
     85                 public void run() {
     86                     // TODO Auto-generated method stub
     87                     Message message = Message.obtain();
     88                     String result="";
     89                     try {
     90                         QueryUploadUtil quu = new QueryUploadUtil(Base64Util.getBase64String(filePath+fileName), "temp.png");
     91                         result= quu.call(wsdl,wsdl);
     92                     } catch (Exception e) {
     93                         // TODO Auto-generated catch block
     94                         e.printStackTrace();
     95                     }
     96                     message.obj=result;
     97                     handler.sendMessage(message);
     98                 }
     99             }).start();
    100         }
    101     }
    102 }

    可以去我的github上下载Demo,两个文件:一个Android客户端,一个服务端。下载地址:https://github.com/weifengzz/UploadFile_1

  • 相关阅读:
    CSS HACK:IE6、IE7、IE8、Firefox兼容性问题解决方案
    C# @符号的多种使用方法
    16个Javascript的Web UI库、框架及工具包
    【分享】20个很不错的UI图标集资源
    JQuery/AjaX/Javascript/DIV+CSS资源下载地址
    发个csdn泄露账户查询地址,没下数据库的童鞋来查一下自己
    【总结】CSS透明度大汇总
    C#综合揭秘——细说事务
    ASP.NET获取客户端、服务器端基础信息集合
    收集的网络上大型的开源图像处理软件代码(提供下载链接)
  • 原文地址:https://www.cnblogs.com/weifengzz/p/5027301.html
Copyright © 2011-2022 走看看