您的位置:首页 > 其它

WebService(4)-AXIS高级特性 传送文件

2010-04-22 18:28 225 查看
文件主要是用到一个DataHandler类,这是一个专门的传送器,可以把文件序列化。然后从传送器中得到一个输入流,从这个输入流中读出数据就是我们从客户端传过来的文件了。



eg:从客户端传送一个文件到服务器去
(1) WebService服务器端方法、
public String transfer(DataHandler handler,String fileName){
File file = new File(fileName);
int flag = 0;
if(handler==null || fileName == null || "".equals(fileName)){
return "failure";
}
InputStream input = null;
FileOutputStream fos = null;
try {
input = handler.getInputStream();
fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
while (input.read(buffer)!=-1){
fos.write(buffer);
}
} catch(Exception ex){
ex.printStackTrace();
} finally{
if(input !=null){
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos !=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return "file trasfer success"+file.getAbsolutePath();
}



(2) server-config.wsdd文件配置
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="wsTestHandler"
type="java:cn.com.chenlly.ssh.webservice.axis.WSTestServiceHandle">
<parameter name="status" value="success" />
</handler>
<!-- 自定义服务 -->
<service name="ws" provider="java:RPC">
<parameter name="className"
value="cn.com.chenlly.ssh.webservice.axis.WSTestServiceImpl" />
<parameter name="allowedMethods" value="*" />
<parameter name="scope" value="request" />

<responseFlow>
<handler type="wsTestHandler" />
</responseFlow>

<requestFlow>
<handler type="wsTestHandler" />
</requestFlow>
<!-- 传送复杂对象 -->
<beanMapping qname="myNSD:Address"
xmlns:myNSD="urn:AddressManager"
languageSpecificType="java:cn.com.chenlly.ssh.webservice.axis.Address">
</beanMapping>
<!-- 文件传输配置 -->
<operation name="transfer"
qname="operNS:transfer"
xmlns:operNS="file"
returnQName="fileSend"
returnType="rtns:string"
xmlns:rtns="http://www.w3.org/2001/XMLSchema">
<parameter name="handler" type="tns:string"
xmlns:tns="http://www.w3.org/2001/XMLSchema" />
<parameter name="fileName" type="myns:DataHandler"
xmlns:tns="http://www.w3.org/2001/XMLSchema" />
</operation>
<typeMapping qname="myns:DataHandler" xmlns:myns="http://fileTransfer.sample"
languageSpecificType="java:javax.activation.DataHandler"
serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</service>

<transport name="http">
<requestFlow>
<handler type="URLMapper" />
</requestFlow>
</transport>
</deployment>
注意:可以通过使用<operation>标签指定关于服务的特殊操作的元数据。这可以将方法的java参数名和特定的XML名进行映射,
为参数指定特定的模式,并将特定的XML名字映射到特定的操作。例如
<operation name="method">
</operation>



(3) 客户端
public class WSTestServiceClient {
public static void main(String[] args) {
Service service = new Service();
try {
//把客户端c 盘下的一个文件通过webService保存到服务器上去
String fileName = "D:/sample.txt";
DataHandler dh=new DataHandler(new FileDataSource(fileName));
Call call = (Call) service.createCall();
String url = "http://192.168.1.98:8082/SSHProject/services/ws?wsdl";
call.setTargetEndpointAddress(new java.net.URL(url));
call.setOperationName(new QName(url,"transfer"));
QName qn=new QName("http://fileTransfer.sample", "DataHandler");
call.registerTypeMapping(dh.getClass(), qn,JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class);
call.addParameter("s1",qn,ParameterMode.IN);
call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnClass(String.class);
String ret=(String)call.invoke(new Object[] {dh,"d:/service.txt"});
System.out.println("transfer success....");
System.out.println(ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: