1、首先进行文件上传下载的的ws操作首先要在我们的项目中添加activation.jar的jar包;
2、创建一个服务类
public class FileService {
//WS的文件上传与下载的服务类
Log log = LogFactory.getLog(FileService.class);
//创建一个基础 路径
public static String Repository = "./files";
//文件上传方法
public String putFile(DataHandler dh, String name) {
//判断上传时的文件名
if(name == null) {
name="test.tmp";
}
log.info("name:"+name);
try {
//上传的文件的路径是否存在
File dir = new File(Repository);
if(!dir.exists()) {
dir.mkdir();
log.info("makedDir :dir "+dir);
}
//获取上传文件的文件流
InputStream input = dh.getInputStream();
//创建一个保存文件输出流
FileOutputStream fos = new FileOutputStream(new File(dir,name));
//创建一个缓冲区
byte[] buffer = new byte[1024*4];
//读取文件的内容
int n = 0;
while((n=input.read(buffer))!=-1) {
fos.write(buffer,0,n);
}
input.close();
fos.close();
} catch( Exception e ) {
e.printStackTrace();
}
return " File: " +name + " send ok ";
}
//创建文件的下载方法
public DataHandler[] getFile(String name) {
log.info("下载的文件名:"+name);
File dir = new File(Repository);// 指明文件的下载目录
if(!dir.exists()) {
dir.mkdir();
}
if(name!= null && !name.equals("")) { //符合条件的文件下载
File data = new File(dir, name);
if(data.exists()) { //确保下载的目录和文件存在
DataHandler[] handlers = new DataHandler[1]; //每次使用一个传输器
handlers[0] = new DataHandler(new FileDataSource(data));//将服务器端的文件包装成数据对象,使用传输器进行传输
log.info("handlers : " + handlers + "[" + handlers.length+"}");
return handlers; //返回传输器
} else {
log.info("return null");
return null;
} else {
//下载的文件名出现了错误
File[] files = dir.listFiles();
DataHandler[] handlers = new DataHandler[files.length]; //准备下载文件夹中的所有的文件
for(int i=0; i<files.length; i++) {
handlers[i] = new DataHandler(new FileDataSource(files[i])); //为每一个文件创建下载的流
}
log.info("handlers :" + handlers + "[" +handlers.length+"}");
return handlers; //返回传输器,返回的是多个文件的传输器对象。
}
}
}
配置server-config.wsdd文件
<service name=“FileService provider="java:RPC">
<parameter name="className" value="anni:file.FileService" />
<parameter name="allowedMethods" value="*" />
<!--这里是下载文件的时候的操作
<operation name="getFile" returnQName="returnqname" returnType="nsl:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMLSchema">
<parameter name="name" type="SchemaNS:string" />
</operation>
<operation name="putFile" returnQName="returnqname" returnType="nsl:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMLSchema">
<parameter name="dh" type="SchemaNS:string" />
<parameter name="name" type="SchemaNS:string" />
</operation>
<typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
type="javax.activation.DataHandler"
qname="nsl:DataHandler"
xmlns:nsl="DataHandler"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</service>
以上是服务端代码
客户端代码
public class FileClient {
Log log = LogFactory.getLog(FileClient.class);
String url = "http://localhost:8080/axis/services/FileService";
QName qname=new QName("FileService", "DataHandler");
Call call = null;
public FileClient() {
init();
}
private void init() {
//创建初始化方法,连接ws。
try {
Service service = new Service();
call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(url));
//在wsdl文件中,注册DataHandler的类型
call.registerTypeMapping(Handler.class, qname, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class);
} catch (Exception e ) {
log.fatal(e);
System.exit(1);
}
}
public void testPutFile() throws Exception{
log.info("put file start...");
init();
//指定上传文件名
String filename = "build.xml";
DataHandler dataHandler = new DataHandler(new FileDataSource(filename));
//指定方法的命名空间
call.setOperationName(new QName(url, "putFile"));
//设置putFile的参数的类型
call.addParameter("s1", qname, ParameterMode.IN);
call.addParameter("s2", XMLType.XSD_STRING, ParameterMode.IN);
//设定返回值的类型
call.setReturnType(XMLType.XSD_STRING);
String result = (String) call.invoke(new Object[] {dataHandler, filename});
log.info(result);
}
//下载的方法
void testGetFile() throws Exception {
log.info("put file start..");
init();
try {
call.setOperationName(new QName(url, "getFile"));
//设置访问调用的方法,传入参数的类型
call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);
//设置调用方法的返回值,数组的使用
call.setReturnType(XMLType.SOAP_ARRAY);
//保存文件
Object[] result = (Object[]) call.invoke(new Object[]{""});
for(int i =0 ; i<result.length; i++) {
log.info("test get File...");
AttachmentPart part = (AttachmentPart) result[i]; //接受数组对象
File rf = new File(part.getDataHandler().getName());
//设置文件的输出流,保存文件
log.info("接受到的文件名:"+rf);
}
} catch ( Exception e ) {
log.error(e);
e.printStackTrace();
}
log.info("end");
}
}
不同版本代码可能存在偏差,基本步骤是这样的。