您的位置:首页 > 其它

web service文件上传下载

2016-03-07 19:46 218 查看
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");

}

}

不同版本代码可能存在偏差,基本步骤是这样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: