web service文件上传下载

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");

         }

}

不同版本代码可能存在偏差,基本步骤是这样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值