Webservice+axisファイル転送
10197 ワード
AXISによるファイル転送
Javaコード package com.chnic.webservice; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.activation.DataHandler; public class FileTransfer { public FileTransfer(){ } public String transfer(DataHandler handler, String fileName){ String fullPath = "C:/"+ fileName; File file = new File(fullPath); int flag = 0; if(handler == null) return "failure"; if(fileName == null) return "failure"; try { InputStream input = handler.getInputStream(); FileOutputStream fos = new FileOutputStream(file); byte[] buffer=new byte[4096]; while((flag=input.read(buffer))!=-1){ fos.write(buffer,0,flag); } input.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); return "failure"; } return "Success"; } }
Transferメソッドはサービス側がクライアントからファイルを受け取るメソッドで,メソッドには2つのパラメータがあり,1つ目はDataHandlerである.このクラスは,専用のシーケンス化クラスによってファイルをシーケンス化するコンベアと見なすことができる.このクラスの具体的な方法はSUNのAPIドキュメントを調べることができます.2番目のパラメータはString文字列で、パラメータ名がわかり、ファイル名が渡されます.
この方法はDataHandlerから入力ストリームを得て、このストリームからデータを読み出して新しいファイルに書きます.これらは基本的なJava I/O操作です.あまり難しくないはずです.サーバーコードの編集が終わったらdeployです.wsddはファイルをパブリッシュします.
Xmlコード xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> qname="operNS:transfer" xmlns:operNS="file" returnQName="fileSend" returnType="rtns:string" xmlns:rtns="http://www.w3.org/2001/XMLSchema"> xmlns:tns="http://www.w3.org/2001/XMLSchema"/> xmlns:tns="http://www.w3.org/2001/XMLSchema"/> 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/"/>
このプロファイルもあまり紹介されていませんが、前のいくつかの要素についての紹介ははっきりしています.ここでorgを述べる必要があります.apache.axis.encoding.ser.JAFDataHandlerSerializerFactoryというクラスです.前にオブジェクトをシーケンス化するときに異なるオブジェクトをシーケンス化するには異なるファクトリクラスが必要であり、同じようにファイルをシーケンス化するときにこのファクトリクラスを使用します.すべてを作成し、tomcatを起動してサービスをリリースします.
サーバ側のコードの作成が完了し、クライアントコードの番になりました.簡単なsampleなので、Cディスクのルートディレクトリの1つのファイルをwebwerviceでCディスクに保存することも簡単です.もちろんファイル名はもう1つ使います.次はクライアントコードです.
Javaコード String fileName = "C:/sample.txt"; DataHandler dh=new DataHandler(new FileDataSource(fileName)); String endpoint="http://localhost:8080/axis/services/FileTransfer"; Service service=new Service(); Call call=(Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName(endpoint, "transfer")); QName qnameattachment=new QName("http://fileTransfer.sample", "myns:DataHandler"); call.registerTypeMapping(dh.getClass(), qnameattachment, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); call.addParameter("s1",qnameattachment,ParameterMode.IN); call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN); call.setReturnClass(String.class); String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"}); System.out.println("transfer success...."); System.out.println(ret);
クライアントはDataHandlerでソースファイルを取得し,その後DataHandlerを登録し,2つの入力パラメータと1つの出力パラメータを登録する.を使用してインポートしたストロークVSラム速度のデータ点を示します.新しいファイルもCディスクの下にaaaaという名前です.txt.テスト世代を実行し、コンソールに2つの言葉を入力します.
transfer success....Success
テストに成功したことを説明して、Cディスクの上でaaaを見つけることができます.txtこのファイル.
Javaコード
package com.chnic.webservice;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.activation.DataHandler;
public class FileTransfer {
public FileTransfer(){
}
public String transfer(DataHandler handler, String fileName){
String fullPath = "C:/" + fileName;
File file = new File(fullPath);
int flag = 0;
if(handler == null)
return "failure";
if(fileName == null)
return "failure";
try {
InputStream input = handler.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer=new byte[4096];
while((flag=input.read(buffer))!=-1){
fos.write(buffer,0,flag);
}
input.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
return "failure";
}
return "Success";
}
}
Transferメソッドはサービス側がクライアントからファイルを受け取るメソッドで,メソッドには2つのパラメータがあり,1つ目はDataHandlerである.このクラスは,専用のシーケンス化クラスによってファイルをシーケンス化するコンベアと見なすことができる.このクラスの具体的な方法はSUNのAPIドキュメントを調べることができます.2番目のパラメータはString文字列で、パラメータ名がわかり、ファイル名が渡されます.
この方法はDataHandlerから入力ストリームを得て、このストリームからデータを読み出して新しいファイルに書きます.これらは基本的なJava I/O操作です.あまり難しくないはずです.サーバーコードの編集が終わったらdeployです.wsddはファイルをパブリッシュします.
Xmlコード
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="FileTransfer" provider="java:RPC">
<parameter name="className" value="com.chnic.webservice.FileTransfer"/>
<parameter name="allowedMethods" value="transfer"/>
<parameter name="scope" value="session"/>
<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>
</deployment>
このプロファイルもあまり紹介されていませんが、前のいくつかの要素についての紹介ははっきりしています.ここでorgを述べる必要があります.apache.axis.encoding.ser.JAFDataHandlerSerializerFactoryというクラスです.前にオブジェクトをシーケンス化するときに異なるオブジェクトをシーケンス化するには異なるファクトリクラスが必要であり、同じようにファイルをシーケンス化するときにこのファクトリクラスを使用します.すべてを作成し、tomcatを起動してサービスをリリースします.
サーバ側のコードの作成が完了し、クライアントコードの番になりました.簡単なsampleなので、Cディスクのルートディレクトリの1つのファイルをwebwerviceでCディスクに保存することも簡単です.もちろんファイル名はもう1つ使います.次はクライアントコードです.
Javaコード
String fileName = "C:/sample.txt";
DataHandler dh=new DataHandler(new FileDataSource(fileName));
String endpoint="http://localhost:8080/axis/services/FileTransfer";
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName(endpoint, "transfer"));
QName qnameattachment=new QName("http://fileTransfer.sample",
"myns:DataHandler");
call.registerTypeMapping(dh.getClass(),
qnameattachment,
JAFDataHandlerSerializerFactory.class,
JAFDataHandlerDeserializerFactory.class);
call.addParameter("s1",qnameattachment,ParameterMode.IN);
call.addParameter("s2",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnClass(String.class);
String ret=(String)call.invoke(new Object[] {dh,"aaaaaa.txt"});
System.out.println("transfer success....");
System.out.println(ret);
クライアントはDataHandlerでソースファイルを取得し,その後DataHandlerを登録し,2つの入力パラメータと1つの出力パラメータを登録する.を使用してインポートしたストロークVSラム速度のデータ点を示します.新しいファイルもCディスクの下にaaaaという名前です.txt.テスト世代を実行し、コンソールに2つの言葉を入力します.
transfer success....Success
テストに成功したことを説明して、Cディスクの上でaaaを見つけることができます.txtこのファイル.