프로그래머의 삶 Programmer's Life/개념과 상식의 이야기? Concept Vs Common sense?

SOAP 에서 첨부파일 전송하기

Oliver's World 2009. 10. 11. 15:34
728x90


간단하게 getFile 과 setFile 이다.

public class fileDownloader {
 FileOutputStream fos;

 public DataHandler getFile() {

  System.out.println("Server send File");

  File file = new File("c:/test.txt");

  if (!file.exists()) {
   System.out.println("file not found!");
   System.exit(0);
  }

  FileDataSource filDataSource = new FileDataSource(file);

  DataHandler dh = new DataHandler(filDataSource);
  return dh;
 }

 public void setFile(DataHandler dh) {
  if (dh == null)
   System.out.println("attachement is null");
  else {
   System.out.println("Client got file");

  }

  try {

   fos = new FileOutputStream("c:/11.txt");
   dh.writeTo(fos);
   fos.flush();
  } catch (FileNotFoundException fe) {
   fe.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}



그 후 클라이언트에서 붙을려고 하였다만...
Eclipse 에서의 자동 생성 코드로는 잘 되질 않았다-_-;;

deploy.wsdd

<?xml version="1.0" encoding="UTF-8"?>
 
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <!-- Services from fileDownloaderService WSDL service -->

 <service name="fileDownloader" provider="java:RPC" style="wrapped" use="literal">
  <parameter name="wsdlTargetNamespace" value="http://download.file.pointi.com" />
  <parameter name="wsdlServiceElement" value="fileDownloaderService" />
  <parameter name="schemaQualified" value="http://download.file.pointi.com" />
  <parameter name="wsdlServicePort" value="fileDownloader" />
  <parameter name="className" value="com.pointi.file.download.fileDownloader" />
  <parameter name="wsdlPortType" value="fileDownloader" />
  <parameter name="typeMappingVersion" value="1.2" />
  
  <operation xmlns:operNS="http://download.file.pointi.com"
   xmlns:retNS="http://download.file.pointi.com" xmlns:rtns="http://xml.apache.org/xml-soap"
   name="getFile" qname="operNS:getFile" returnQName="retNS:getFileReturn"
   returnType="rtns:DataHandler" soapAction="">
  </operation>
  <operation xmlns:operNS="http://download.file.pointi.com"
   name="setFile" qname="operNS:setFile" soapAction="">
   <parameter xmlns:pns="http://download.file.pointi.com"
    xmlns:tns="http://xml.apache.org/xml-soap" qname="pns:dh" type="tns:DataHandler" />
  </operation>
  <parameter name="allowedMethods" value="getFile setFile" />

  <typeMapping
   deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
   serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
   languageSpecificType="java:javax.activation.DataHandler" qname="DataHandler"
   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />


 </service>
</deployment>

에서처럼  typeMapping 을 추가하였으며
lib 는 activation.jar 와 mail.jar 를 추가하여 활용하였다.

그리고 결국 클라이언트에서는

public static void main(String[] args) throws Exception {
  FileOutputStream fos;
  FileDownloader down = new FileDownloaderServiceLocator()
    .getfileDownloader();
  DataHandler dh = down.getFile();
  if (dh == null)
   System.out.println("attachement is null");
  else {
   System.out.println("Client got file");

  }

  try {

   fos = new FileOutputStream("c:/file.txt");
   dh.writeTo(fos);
   fos.flush();
  } catch (FileNotFoundException fe) {
   fe.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();

  } catch (Exception e) {
   e.printStackTrace();
  }

  File file = new File("c:/file.txt");

  if (!file.exists()) {
   System.out.println("file not found!");
   System.exit(0);
  }

  FileDataSource filDataSource = new FileDataSource(file);

  DataHandler fdh = new DataHandler(filDataSource);
  down.setFile(fdh);

 }



이런 간단한 방법으로 테스트 하였다 ㄱ-;

...보면 알겠지만 서버로부터 getFile()을 요청하여 DataHandler 를 받아서 file.txt 로 저장하고 이를 다시 읽여들여 서버의 setFile(DataHandler )  로서 파일에 다시 전송후 서버에서는 11.txt로 파일을 저장하였다 - _-;

뭔가 간단무쌍한거처럼 보이지만...
..
..
fileDownloader.wsdl 에서

   <element name="getFileReturn" type="apachesoap:DataHandler"/>

   <element name="dh" type="apachesoap:DataHandler"/>

위의 두 부분에서 오류가 발생한다....
근데.....
왜 되는거지-_-;??
뭔가 심히 이상하다 ㄱ-;;
namespace 로 되어 있는 apachesoap 의 경우
 xmlns:apachesoap="http://xml.apache.org/xml-soap"
위와 같으나....없다-_-; DTD는 어디에 숨어있는것인가..??

뭔가 이상하다;;
이유를 알게된다면....여기 내용을 업데이트 해야겠다..-_-;

728x90