http://blog.csdn.net/haha_mingg/article/details/6347588
有时我们可以看到,图片往往被提交到服务器端,这里我通过XFire框架来实现远程上传以及下载图片的功能。
首先我们来看看从服务器端下载图片的功能:
我用的是KSOAP框架,我之前的文章有讲述过。在这里不要多说,贴上代码。
首先我们看看Acitivity中的代码:
[java] view plaincopyprint?
- package com.net.connect.app;
- import java.io.File;
- import java.io.FileInputStream;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.Toast;
- import com.base.encry.decry.app.Base64;
- import com.base.file.util.FileOperate;
- import com.cn.blogs.ksoap.app.MyWebServiceHelper;
- public class UpAndDownPicFileActivity extends Activity {
- ImageView imageView;
- public static final String filename = "xfire.png";
- public static final String fileDir = "/sdcard/xmlfile/";
- public MyWebServiceHelper myWebServiceHelper = new MyWebServiceHelper();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.upanddownpic);
- imageView = (ImageView) this.findViewById(R.id.imageView1);
- // Bitmap
- // bitmap=BitmapFactory.decodeFile("/sdcard/xmlfile/"+"xfire.png");
- // imageView.setImageBitmap(bitmap);
- Button downButton = (Button) findViewById(R.id.downbutton);
- downButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- myWebServiceHelper.getTranferFileString(filename);
- // 收到服务器端发送过来的图片,然后显现在图片框中
- Bitmap bitmap = BitmapFactory.decodeFile(fileDir + filename);
- imageView.setImageBitmap(bitmap);
- }
- });
- Button upButton = (Button) findViewById(R.id.upbutton);
- upButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- String fileContent = "";
- FileOperate.OpenOrCreateFile(filename);
- fileContent = FileOperate.bin2XmlString(fileDir+filename);
- // Toast.makeText(UpAndDownPicFileActivity.this, fileContent, Toast.LENGTH_LONG).show();
- String result=myWebServiceHelper.upToServerOfFileStringWithEncode(filename,
- fileContent);
- try {
- Thread.currentThread().sleep(2000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Toast.makeText(UpAndDownPicFileActivity.this, result, Toast.LENGTH_LONG).show();
- // 收到服务器端发送过来的图片,然后显现在图片框中
- //imageView.setImageBitmap(null);
- }
- });
- }
- }
分别实现了远程上传和下载图片的功能。它的处理类集中在MyWebServiceHelper,它实现了远程获取和上传的细节功能。
这个功能都是通过KSOAP框架实现的。下面贴上它的代码,如下所示:
- // WSDL文档中的命名空间
- private static final String targetNameSpace = "http://android.googlepages.com/";
- // WSDL文档中的URL
- private static final String WSDL = "http://10.10.178.71:8888/WSDLApp/services/MyService";
- // 需要调用的方法名(获得Myervices中的helloWorld方法)
- private static final String getHelloworld = "helloWorld";
- //需要调用的方法名(获得Myervices中的login方法)
- private static final String getLogin="login";
- //获取加密图片的字符串
- private static final String getTranferFileStringWithEncode="tranferFileStringWithEncode";
- //获取加密图片的字符串
- private static final String upToServerOfFileContent="fetchFileStringWithEncode";
- public String getTranferFileString(String filename) {
- String fileContent = "";
- SoapObject soapObject = new SoapObject(targetNameSpace,getTranferFileStringWithEncode);
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
- envelope.dotNet = false;
- envelope.setOutputSoapObject(soapObject);
- HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
- try {
- httpTranstation.call(targetNameSpace + getTranferFileStringWithEncode, envelope);
- SoapObject result = (SoapObject ) envelope.bodyIn;//getResponse();
- fileContent=(String) result.getProperty(0).toString();
- //String strFile="downfromserive"+Math.random()+".png";
- FileOperate.OpenOrCreateFile(filename);
- FileOperate.xmlString2Bin(fileContent, new File(filename));
- // 也可以通过下面方式获得str
- // SoapPrimitive result = (SoapPrimitive ) envelope.getResponse();
- // str=result.toString();
- // 直指value字符串值
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return fileContent;
- }
- public String upToServerOfFileStringWithEncode(String filename,String fileContent) {
- String str = "";
- SoapObject soapObject = new SoapObject(targetNameSpace,upToServerOfFileContent);
- soapObject.addProperty("filename", filename);
- soapObject.addProperty("fileContent", fileContent);
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
- envelope.dotNet = false;
- envelope.setOutputSoapObject(soapObject);
- HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
- try {
- httpTranstation.call(targetNameSpace + upToServerOfFileContent, envelope);
- SoapObject result = (SoapObject ) envelope.bodyIn;//getResponse();
- str=(String) result.getProperty(0).toString();
- //返回上传成功0,1标志位
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- return e.getMessage();
- } catch (XmlPullParserException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- return e.getMessage();
- }
- return str;
- }
在第二个函数中有:
- SoapObject soapObject = new SoapObject(targetNameSpace,upToServerOfFileContent);
- soapObject.addProperty("filename", filename);
- soapObject.addProperty("fileContent", fileContent);
这个是android客户端传送服务器端的参数参数。
而里面有个FileOperate.java类,这个类负责对文件操作。我封装在这个类中,方便集中处理以及调用。
下面贴上代码。如下所示:
- package com.base.file.util;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import com.base.encry.decry.app.Base64;
- public class FileOperate {
- //在SD卡中创建文件
- public static void OpenOrCreateFile(String filename){
- // 获取扩展SD卡设备状态
- String sDStateString = android.os.Environment
- .getExternalStorageState();
- if (sDStateString.equals(android.os.Environment.MEDIA_MOUNTED)) {
- // String strFile="downfromserive"+Math.random()+".png";
- // 获取扩展存储设备的文件目录
- File SDFile = android.os.Environment
- .getExternalStorageDirectory();
- File destDir = new File("/sdcard/xmlfile");
- // File destDir = new File(SDFile.getAbsolutePath() +
- // destDirStr);
- if (!destDir.exists())
- destDir.mkdir();
- // Toast.makeText(SDCardTest., text, duration)
- // 打开文件
- File myFile = new File(destDir + File.separator + filename);
- // 判断是否存在,不存在则创建
- if (!myFile.exists()) {
- try {
- myFile.createNewFile();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- //删除指定文件,比如临时文件
- public static void removeFile(String filename){
- if(new File(filename).exists())
- new File(filename).delete();
- }
- //解密,并将内容写入至指定文件中
- public static boolean xmlString2Bin(String base64String, File file) {
- byte[] data;
- FileOutputStream output = null;
- boolean ret = false;
- try {
- data = Base64.decode(base64String);
- output = new FileOutputStream(file);
- output.write(data);
- output.close();
- ret = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return ret;
- }
- //将文件内容加密
- public static String bin2XmlString(String filename) {
- byte[] data = null;
- FileInputStream input = null;
- String ret = null;
- int n;
- try {
- data = new byte[(int) new File(filename).length()];
- input = new FileInputStream(new File(filename));
- n = input.read(data);//这个就是一个文件读取过程。没有写while,一次性读完
- input.close();
- ret = new String(Base64.encode(data));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return ret;
- }
- }
当然,我们还在看看这个Activity.java中的布局文件。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="@string/hello" />
- <Button android:id="@+id/downbutton" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="下载" />
- <Button android:id="@+id/upbutton" android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="上传" />
- <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
而服务器端用的是XFire框架,这在之前的文章中讲过。不必多说。
看下面的代码:
在AccountImp.java中实现IAccount.java方法。
- public String tranferFileStringWithEncode() {
- // TODO Auto-generated method stub
- return FileOperate.bin2XmlString("E://Workspaces//workspace//WSDLApp//"+"girl.png");
- }
- public String fetchFileStringWithEncode(String filename, String fileContent) {
- // TODO Auto-generated method stub
- //创建该新文件,并返回成功
- try {
- //打开并创建文件
- FileOperate.OpenOrCreateFile(filename);
- String pathFile="E://Workspaces//workspace//WSDLApp";
- //解密,并将内容添加至该文件中
- FileOperate.xmlString2Bin(fileContent, new File("E://Workspaces//workspace//WSDLApp//xfire.png"));
- return "上传成功";
- } catch (Exception e) {
- // TODO: handle exception
- return "上传失败";
- }
- }
IAccount.java
- //将 POJO 发布成 Web 服务:有两种方法,接口和实现类是其中之一
- public interface IAccount {
- public int account(int x,int y);
- public String helloWorld(String str);
- //访问mysql数据库
- public int login(String username,String password);
- //传送图片字符串
- public String tranferFileStringWithEncode();
- //接收远程传送过来的图片字符串
- public String fetchFileStringWithEncode(String username,String filename);
- }
而这个XFIRE要在web.xml中注册.
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <servlet>
- <servlet-name>XFireServlet</servlet-name>
- <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
这样Web服务就用去查找services目录下。所以还要在WebServices目录下(在该服务器端要目录下)创建
services.xml文件。如下所示:
- <!-- 服务一:简单计算,直接输出 -->
- <service>
- <name>MyService</name>
- <serviceClass>test.IAccount</serviceClass>
- <implementationClass>test.AccountImp</implementationClass>
- <mce:style><!--
- wrapped
- --></mce:style><style mce_bogus="1">wrapped</style>
- <use>literal</use>
- <scope>application</scope>
- <namespace>http://android.googlepages.com/</namespace>
- </service>
最终实现效果如下所示:
点击上传按钮
点击下载按钮