文件主要是用到一个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",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();??}?}}