快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

用 APACHE 传送文件

建立Web service的目的是将数据转变成XML格式。将一个购买订单转变为XML格式十分简朴,但是假如是像幻灯片或者即使是单一的图像之类更加复杂的数据类型又会怎样呢?让我们看一看你如何使用Apache SOAP来传输文件给你的Web service。



简朴情况
在这个例子中我们的Web service是一个将文件存储到服务器上的归档系统,在实际情况中,你可能会使用FTP实现这些简朴的事情。在这种情况下,我们建立服务类来接收一个文件并将其存储到服务器上。同时,我们还创建一个客户类来调用Web service。


The ArchiveService
我们说的ArchiveService类由一个单独的StoreFile方式组成。这个方式带了两个参数:一个是文件名,另一个是DataHandler对象,这个文件名明显是用来传输文件的名字,而DataHandler则治理文件内容的传送。清单1显示了用来创建这个类的ArchiveService.java文件。

清单1:ArchiveService.java

import java.io.*;
import java.util.*;
import javax.activation.*;
public class ArchiveService {
public String StoreFile (String filename, DataHandler dh) throws IOException {
FileOutputStreamfos = new FileOutputStream("C:wsfiles" + filename);
Object o = dh.getContent();
dh.writeTo(fos);
fos.close();
return "File received: " + filename;
}
}

将要传送的文件在DataHandler对象中被传送,当StoreFile方式被调用时,一个新的文件被写入服务器上的某个特定位置(在这个例子中,在C:wsfiles目录下)。有一条信息返回给客户用来确认文件已经被接收。


The ArchiveClient
ArchiveClient类比服务要复杂一些,正如你在清单2种看到的相同。这个类使用了基于Call对象的标准SOAP客户设置。他们的主要区别是我们使用一个DataHandler来存储文件数据。文件内容实际上被装载到Datasource对象中用以创建一个新的DataHandler。接着我们将DataHandler作为一个参数传送给ArchiveServe的StroeFile方式。


清单2:ArchiveClient.java
import java.io.*;
import java.util.*;
import java.net.*;
import javax.activation.*;
import org.apache.soap.*;
import org.apache.soap.util.mime.*;
import org.apache.soap.rpc.*;

public class ArchiveClient {
public void StoreFile(String filename) {
URL url;
Call call = new Call();
String urn = "urn:ArchiveService";
try {
url = new URL("http://localhost/soap/servlet/rpcrouter");
call.setTargetObjectURI(urn);
call.setMethodName("StoreFile");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC );
Vector params = new Vector();
File file = new File(filename);
DataSourceds = new ByteArrayDataSource(new File(filename), null);
DataHandler dh = new DataHandler(ds);
params.addElement(new Parameter("filename", String.class, file.getName(), null));
params.addElement(new Parameter("dh", javax.activation.DataHandler.class, dh, null));
call.setParams(params);
Response response = call.invoke(url, "");

if (!response.generatedFault()) {
Parameter p = response.getReturnValue();
System.out.println("Response = " + p.getValue());
} else {
Fault f = response.getFault();
System.out.println("Fault: " + f.getFaultString());
}
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
public static void main(String[] args) {
ArchiveClient ac = new ArchiveClient();
ac.StoreFile("C:wsfilessourcefoo.jpg");
}
}


数据处理程序(The DataHandler)
在这个例子中,DataHandler对象真正的展现了它的力量,其原因是Java Activation Framework提供了数据的顺序化和无序化,并且自动地将它附给SOAP信息。你的文件数据不是直接用XML形式传送,而是以一个附件形式传送给SOAP封装的。整个SOAP哀求第一部分是SOAP封装,第二部分是附件。这基本上与在e-mail信息中发送附件的格式一样。当服务器接收到多个哀求时,它会自动地找到相应的附件供SOAP服务使用。
返回类别: 教程
上一教程: J2EE修炼之四书五经
下一教程: 类似MSDN CSDN导航树效果,JSP+JAVASCRIPT实现

您可以阅读与"用 APACHE 传送文件"相关的教程:
· 基于APACHE 配置文件的WEB页面访问权限控制
· Apache泄露重写的任意文件漏洞 
· JavaBean实现多文件上传的两种方式
· 用JSP下载WORD文件
· 在JSP开发中使用JDOM解析临时存放数据的XML文件
    微笑服务 优质保证 索取样品