文件主要是用到一个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(); } }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。