在Android远程上传以及下载图片---XFire框架

简介:

http://blog.csdn.net/haha_mingg/article/details/6347588

  有时我们可以看到,图片往往被提交到服务器端,这里我通过XFire框架来实现远程上传以及下载图片的功能。

首先我们来看看从服务器端下载图片的功能:

 

我用的是KSOAP框架,我之前的文章有讲述过。在这里不要多说,贴上代码。

 

首先我们看看Acitivity中的代码:

 [java] view plaincopyprint?

  1. package com.net.connect.app;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import android.app.Activity;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.ImageView;  
  12. import android.widget.Toast;  
  13. import com.base.encry.decry.app.Base64;  
  14. import com.base.file.util.FileOperate;  
  15. import com.cn.blogs.ksoap.app.MyWebServiceHelper;  
  16. public class UpAndDownPicFileActivity extends Activity {  
  17.     ImageView imageView;  
  18.     public static final String filename = "xfire.png";  
  19.     public static final String fileDir = "/sdcard/xmlfile/";  
  20.     public MyWebServiceHelper myWebServiceHelper = new MyWebServiceHelper();  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.upanddownpic);  
  26.         imageView = (ImageView) this.findViewById(R.id.imageView1);  
  27.         // Bitmap  
  28.         // bitmap=BitmapFactory.decodeFile("/sdcard/xmlfile/"+"xfire.png");  
  29.         // imageView.setImageBitmap(bitmap);  
  30.         Button downButton = (Button) findViewById(R.id.downbutton);  
  31.         downButton.setOnClickListener(new OnClickListener() {  
  32.             @Override  
  33.             public void onClick(View v) {  
  34.                 // TODO Auto-generated method stub  
  35.                 myWebServiceHelper.getTranferFileString(filename);  
  36.                 // 收到服务器端发送过来的图片,然后显现在图片框中  
  37.                 Bitmap bitmap = BitmapFactory.decodeFile(fileDir + filename);  
  38.                 imageView.setImageBitmap(bitmap);  
  39.             }  
  40.         });  
  41.         Button upButton = (Button) findViewById(R.id.upbutton);  
  42.         upButton.setOnClickListener(new OnClickListener() {  
  43.             @Override  
  44.             public void onClick(View v) {  
  45.                 // TODO Auto-generated method stub  
  46.                 String fileContent = "";  
  47.                 FileOperate.OpenOrCreateFile(filename);  
  48.                 fileContent = FileOperate.bin2XmlString(fileDir+filename);  
  49.                   
  50.             //  Toast.makeText(UpAndDownPicFileActivity.this, fileContent, Toast.LENGTH_LONG).show();  
  51.                 String result=myWebServiceHelper.upToServerOfFileStringWithEncode(filename,  
  52.                         fileContent);  
  53.                   
  54.                 try {  
  55.                     Thread.currentThread().sleep(2000);  
  56.                 } catch (InterruptedException e) {  
  57.                     // TODO Auto-generated catch block  
  58.                     e.printStackTrace();  
  59.                 }  
  60.                   
  61.                 Toast.makeText(UpAndDownPicFileActivity.this, result, Toast.LENGTH_LONG).show();  
  62.                 // 收到服务器端发送过来的图片,然后显现在图片框中  
  63.                 //imageView.setImageBitmap(null);  
  64.             }  
  65.         });  
  66.     }  
  67. }  

 

 

分别实现了远程上传和下载图片的功能。它的处理类集中在MyWebServiceHelper,它实现了远程获取和上传的细节功能。

这个功能都是通过KSOAP框架实现的。下面贴上它的代码,如下所示:

 

[java]  view plain copy print ?
  1. // WSDL文档中的命名空间  
  2. private static final String targetNameSpace = "http://android.googlepages.com/";  
  3.   
  4. // WSDL文档中的URL  
  5. private static final String WSDL = "http://10.10.178.71:8888/WSDLApp/services/MyService";  
  6. // 需要调用的方法名(获得Myervices中的helloWorld方法)  
  7. private static final String getHelloworld = "helloWorld";  
  8.   
  9. //需要调用的方法名(获得Myervices中的login方法)  
  10. private static final String getLogin="login";  
  11.   
  12. //获取加密图片的字符串  
  13. private static final String getTranferFileStringWithEncode="tranferFileStringWithEncode";  
  14.   
  15. //获取加密图片的字符串  
  16. private static final String upToServerOfFileContent="fetchFileStringWithEncode";  
  17. public String  getTranferFileString(String filename) {  
  18.     String fileContent = "";  
  19.     SoapObject soapObject = new SoapObject(targetNameSpace,getTranferFileStringWithEncode);  
  20.       
  21.     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  22.     envelope.dotNet = false;  
  23.     envelope.setOutputSoapObject(soapObject);  
  24.     HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);  
  25.       
  26.     try {  
  27.         httpTranstation.call(targetNameSpace + getTranferFileStringWithEncode, envelope);  
  28.         SoapObject  result = (SoapObject ) envelope.bodyIn;//getResponse();  
  29.           
  30.         fileContent=(String) result.getProperty(0).toString();  
  31.           
  32.           
  33.         //String strFile="downfromserive"+Math.random()+".png";  
  34.           
  35.        FileOperate.OpenOrCreateFile(filename);  
  36.           
  37.         FileOperate.xmlString2Bin(fileContent, new File(filename));  
  38.           
  39.           //  也可以通过下面方式获得str  
  40.          //  SoapPrimitive  result = (SoapPrimitive ) envelope.getResponse();  
  41.         //  str=result.toString();  
  42.        //   直指value字符串值  
  43.     } catch (IOException e) {  
  44.         // TODO Auto-generated catch block  
  45.         e.printStackTrace();  
  46.     } catch (XmlPullParserException e) {  
  47.         // TODO Auto-generated catch block  
  48.         e.printStackTrace();  
  49.     }  
  50.     return fileContent;  
  51. }  
  52.   
  53.   
  54. public String  upToServerOfFileStringWithEncode(String filename,String fileContent) {  
  55.     String str = "";  
  56.     SoapObject soapObject = new SoapObject(targetNameSpace,upToServerOfFileContent);  
  57.       
  58.     soapObject.addProperty("filename", filename);  
  59.     soapObject.addProperty("fileContent", fileContent);  
  60.   
  61.     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  62.     envelope.dotNet = false;  
  63.     envelope.setOutputSoapObject(soapObject);  
  64.     HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);  
  65.       
  66.     try {  
  67.         httpTranstation.call(targetNameSpace + upToServerOfFileContent, envelope);  
  68.         SoapObject  result = (SoapObject ) envelope.bodyIn;//getResponse();  
  69.           
  70.         str=(String) result.getProperty(0).toString();  
  71.         //返回上传成功0,1标志位  
  72.           
  73.     } catch (IOException e) {  
  74.         // TODO Auto-generated catch block  
  75.         e.printStackTrace();  
  76.         return e.getMessage();  
  77.     } catch (XmlPullParserException e) {  
  78.         // TODO Auto-generated catch block  
  79.         e.printStackTrace();  
  80.         return e.getMessage();  
  81.     }  
  82.     return str;  
  83. }  

 

 

在第二个函数中有:

 

[java]  view plain copy print ?
  1. SoapObject soapObject = new SoapObject(targetNameSpace,upToServerOfFileContent);  
  2.       
  3.     soapObject.addProperty("filename", filename);  
  4.     soapObject.addProperty("fileContent", fileContent);  

 

这个是android客户端传送服务器端的参数参数。

 

而里面有个FileOperate.java类,这个类负责对文件操作。我封装在这个类中,方便集中处理以及调用。

下面贴上代码。如下所示:

 

[java]  view plain copy print ?
  1. package com.base.file.util;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import com.base.encry.decry.app.Base64;  
  7. public class FileOperate {  
  8.       
  9.       
  10.     //在SD卡中创建文件  
  11.     public static void OpenOrCreateFile(String filename){  
  12.         // 获取扩展SD卡设备状态  
  13.         String sDStateString = android.os.Environment  
  14.                 .getExternalStorageState();  
  15.         if (sDStateString.equals(android.os.Environment.MEDIA_MOUNTED)) {  
  16.             // String strFile="downfromserive"+Math.random()+".png";  
  17.             // 获取扩展存储设备的文件目录  
  18.             File SDFile = android.os.Environment  
  19.                     .getExternalStorageDirectory();  
  20.             File destDir = new File("/sdcard/xmlfile");  
  21.             // File destDir = new File(SDFile.getAbsolutePath() +  
  22.             // destDirStr);  
  23.             if (!destDir.exists())  
  24.                 destDir.mkdir();  
  25.             // Toast.makeText(SDCardTest., text, duration)  
  26.             // 打开文件  
  27.             File myFile = new File(destDir + File.separator + filename);  
  28.               
  29.             // 判断是否存在,不存在则创建  
  30.             if (!myFile.exists()) {  
  31.                 try {  
  32.                     myFile.createNewFile();  
  33.                 } catch (IOException e) {  
  34.                     // TODO Auto-generated catch block  
  35.                     e.printStackTrace();  
  36.                 }  
  37.             }  
  38.         }  
  39.     }  
  40.       
  41.       
  42.     //删除指定文件,比如临时文件  
  43.     public static void removeFile(String filename){  
  44.         if(new File(filename).exists())  
  45.             new File(filename).delete();  
  46.     }  
  47.       
  48.     //解密,并将内容写入至指定文件中  
  49.     public static boolean xmlString2Bin(String base64String, File file) {  
  50.         byte[] data;  
  51.         FileOutputStream output = null;  
  52.         boolean ret = false;  
  53.         try {  
  54.             data = Base64.decode(base64String);  
  55.             output = new FileOutputStream(file);  
  56.             output.write(data);  
  57.             output.close();  
  58.             ret = true;  
  59.         } catch (Exception e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.         return ret;  
  63.     }  
  64.       
  65.       
  66.     //将文件内容加密  
  67.     public static String bin2XmlString(String filename) {  
  68.         byte[] data = null;  
  69.         FileInputStream input = null;  
  70.         String ret = null;  
  71.         int n;  
  72.         try {  
  73.             data = new byte[(intnew File(filename).length()];  
  74.             input = new FileInputStream(new File(filename));  
  75.               
  76.             n = input.read(data);//这个就是一个文件读取过程。没有写while,一次性读完  
  77.             input.close();  
  78.             ret = new String(Base64.encode(data));  
  79.         } catch (Exception e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.         return ret;  
  83.     }  
  84. }  

 

 

当然,我们还在看看这个Activity.java中的布局文件。

 

[xhtml]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="@string/hello" />  
  7.     <Button android:id="@+id/downbutton" android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content" android:text="下载" />  
  9.   
  10. <Button android:id="@+id/upbutton" android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content" android:text="上传" />  
  12.     <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent"  
  13.         android:layout_height="wrap_content" />  
  14. </LinearLayout>  

 

 

而服务器端用的是XFire框架,这在之前的文章中讲过。不必多说。

看下面的代码:

 

在AccountImp.java中实现IAccount.java方法。

 

[java]  view plain copy print ?
  1. public String tranferFileStringWithEncode() {  
  2.         // TODO Auto-generated method stub  
  3.         return FileOperate.bin2XmlString("E://Workspaces//workspace//WSDLApp//"+"girl.png");  
  4.     }  
  5.     public String fetchFileStringWithEncode(String filename, String fileContent) {  
  6.         // TODO Auto-generated method stub  
  7.           
  8.         //创建该新文件,并返回成功  
  9.           
  10.         try {  
  11.               
  12.             //打开并创建文件  
  13.             FileOperate.OpenOrCreateFile(filename);  
  14.               
  15.             String pathFile="E://Workspaces//workspace//WSDLApp";  
  16.             //解密,并将内容添加至该文件中  
  17.             FileOperate.xmlString2Bin(fileContent, new File("E://Workspaces//workspace//WSDLApp//xfire.png"));  
  18.               
  19.             return "上传成功";  
  20.         } catch (Exception e) {  
  21.             // TODO: handle exception  
  22.             return "上传失败";  
  23.         }  
  24.           
  25.           
  26.     }  

 

 

IAccount.java

 

[java]  view plain copy print ?
  1. //将 POJO 发布成 Web 服务:有两种方法,接口和实现类是其中之一  
  2. public interface IAccount {  
  3.     public int account(int x,int y);   
  4.       
  5.     public String helloWorld(String str);  
  6.       
  7.     //访问mysql数据库  
  8.     public int login(String username,String password);  
  9.       
  10.       
  11.     //传送图片字符串  
  12.     public String tranferFileStringWithEncode();  
  13.       
  14.     //接收远程传送过来的图片字符串  
  15.     public String fetchFileStringWithEncode(String username,String filename);  
  16.       
  17.       
  18. }  

 

 

而这个XFIRE要在web.xml中注册.

 

[xhtml]  view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  3.   <servlet>  
  4.     <servlet-name>XFireServlet</servlet-name>  
  5.     <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
  6.     <load-on-startup>0</load-on-startup>  
  7.   </servlet>  
  8.   <servlet-mapping>  
  9.     <servlet-name>XFireServlet</servlet-name>  
  10.     <url-pattern>/services/*</url-pattern>  
  11.   </servlet-mapping>  
  12.   <welcome-file-list>  
  13.     <welcome-file>index.jsp</welcome-file>  
  14.   </welcome-file-list>  
  15. </web-app>  

 

 

这样Web服务就用去查找services目录下。所以还要在WebServices目录下(在该服务器端要目录下)创建

services.xml文件。如下所示:

 

[java]  view plain copy print ?
  1. <!-- 服务一:简单计算,直接输出 -->  
  2.     <service>  
  3.         <name>MyService</name>  
  4.         <serviceClass>test.IAccount</serviceClass>  
  5.         <implementationClass>test.AccountImp</implementationClass>  
  6.         <mce:style><!--  
  7. wrapped  
  8. --></mce:style><style mce_bogus="1">wrapped</style>  
  9.         <use>literal</use>  
  10.         <scope>application</scope>  
  11.         <namespace>http://android.googlepages.com/</namespace>  
  12.     </service>  

 

最终实现效果如下所示:

 

点击上传按钮

 

 

 

点击下载按钮

 


相关文章
|
3天前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
15 3
|
21天前
|
敏捷开发 Java 机器人
云效产品使用常见问题之打包后的Android应用获取下载地址失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
37 0
|
5月前
|
JSON 前端开发 Android开发
Android MVI框架搭建与使用(上)
Android MVI框架搭建与使用(上)
126 0
|
3天前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
11 3
|
3天前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
11 4
|
5天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
12 0
|
6天前
|
Android开发
Android中Glide加载Https图片失败的解决方案
Android中Glide加载Https图片失败的解决方案
14 1
|
20天前
|
Java Android开发
Android Mediatek 添加 APK 安装和下载开关
Android Mediatek 添加 APK 安装和下载开关
8 0
|
1月前
|
Android开发
Android保存图片到相册(适配android 10以下及以上)
Android保存图片到相册(适配android 10以下及以上)
29 1