在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>  

 

最终实现效果如下所示:

 

点击上传按钮

 

 

 

点击下载按钮

 


相关文章
|
8月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
230 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
197 4
|
3月前
|
存储 人工智能 文字识别
三款安卓手机word编辑器下载,Microsoft Word,wps office,Word手机版,手机word编辑查看阅读器,PDF转换器apk下载
WPS Office是一款功能强大的办公软件,支持文档编辑、表格处理和演示文稿制作,兼容多种格式并提供丰富的云服务。它具备低内存占用、快速运行的特点,支持跨设备同步与多人协作,内置海量模板及AI辅助功能,如智能写作和PPT自动生成。此外,还可扫描文件、编辑PDF并转换为其他格式,极大提升办公效率,适合手机用户便捷操作。
209 1
|
5月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
231 3
Android利用selector(选择器)实现图片动态点击效果
|
7月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1396 77
|
5月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
165 8
|
5月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
181 1
|
8月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
214 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
259 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章