'파일전송'에 해당되는 글 1건

  1. 2008.02.16 nuSoap을 이용한 서버간의 파일전송

첨부파일 참고!


안녕하세요?
'Eisemheim'(구 eitech)입니다.
갑작스럽게 개명을 한건 그냥 그러고 싶었습니다 -_-;;

우선 soap하면 생소하신분들도 있을테고 RPC에 관심이 많으신분들은
한번쯤은 써보셨으리라 생각됩니다.
또한 sms나 mms문자전송을 서비스하시는분들은 다들 사용해보셨을겁니다.
(왜냐구요? 저도 sms/mms때문에 soap에 빠졌거든요 -_-;;)
그럼 서론으로 들어가자면..

1. 왜 soap에대해 글을 올리느냐?!

xml전문을 이용한 서버간의 통신입니다.
이미 phpschool에도 soap으로 통신을 시도한분들이 몇분 계시더군요..
저도 처음에는 그걸보고 시작했습니다만,
약간 자료가 부족한듯해서..
(강좌가 부실하다는 뜻이 아닙니다 -_-;;)

2. 그럼 왜 xml전문을통해 서버간에 통신을 해야하느냐?

말이 서버간의 통신이지..
soap의 발단은 이렇습니다.
웹프로그램과 일반 소켓 프로그램간의 호환성때문입니다.
xml은 웹에서나 소켓에서나 파싱라이브러리가 있어서 쓰게 됬다고 합니다.
(그렇게 자료를 읽었습니다..)

서론이 길면 읽지도 않을테니..
본론으로 들어가겠습니다.


준비물이 필요합니다.
nusoap 라이브러리, Mail Mime, PEAR(?)
이거 3개면 됩니다.

nusoap라이브러리는 soap통신을 하기위한 클레스입니다.
그리고 Mail Mime은 이름에서도 알수가 있듯이
Mail과 관련된 함수 입니다. e-mail보낼때 파일첨부하려면
멀티파트로 보내잖아요? soap도 파일을 전송할때 멀티파트로 보냅니다.
PEAR(?) 이건..뭐.. 저도 뭔지 모릅니다 -_-;;
그냥 인클루드 에러나서 찾아보니 있더군요..;;
(PHP실력이 그다지 좋은게 아니라..)


그럼 준비는 끝났고,
서버 구성을 한번해보겠습니다.

[soapServer.php]

일단 기본적인 soap라이브러리를 인클루드 합니다.
include_once("soapLib/nusoap.php");
include_once("soapLib/nusoapmime.php");


$server = new nusoapservermime();
soap서버를 생성합니다.
여기서 soapserver로 생성하시면 파일전송이 안됩니다 -_-;;

$server->configureWSDL('getfile', 'urn:getfile');
WSDL설정을 합니다.
WSDL이 뭐냐 하면요..
Web Services Description Language의 약어로
SOAP 메시지 집합 및 해당 메시지가 교환되는 방법을 설명하는 XML 문서입니다.
wsdl을 함수 명으로 했습니다.
그리고 urn도 함수명으로 했구요

$server->register('getfile', array("fileName"=>"xsd:String"), array("return"=>"xsd:String"), 'namespace', 'namespac#getfile');
함수를 등록합니다.
soap을 정확히 설명드리자면,
서버쪽에 정의 되어있는 함수/클레스를 실행시키는겁니다.
API라고 해야하나요? 아무튼 그렇습니다.

getfile는 함수 명입니다.
그리고 두번자 인자는 배열이어야 합니다.
fileName는 클라이언트 쪽에서 보내는 첫번째 인자, 그리고 xsd:String은
클라이언트쪽에서 저희쪽으로 보내는 값의 형태입니다.
php에서는 별 상관 없다 느껴지겠지만
php 외에는 민감하게 반응합니다.
그리고 세번재 인자는 반환되는 값입니다.
함수에서 return을 생각하시면됩니다.
반환되는것도 어떤형태인지 정해주시면 됩니다.
namespace, namespace#getfile << 이건 저도 아직정확히 개념을 못잡았습니다 -_-;;


$server->service($HTTP_RAW_POST_DATA);
이건..!!
왠지 예전에 POST로 받을때랑 비슷하지죠?
XFORM이라는건대요 php.net가보면 자세히 나와있습니다.
간단하게 설명드리자면 xml로 form값을대체해서 전송하는 어쩌고저쩌고...
아무튼, 받은 XML을 클레스에 넣습니다.

그럼!! soap서버 셋팅은 끝났습니다!!
뭐이리 간단하냐구요?

nusoap.php를 열어보십시오..
눈돌아갑니다 -_-;;

그럼 정리를 하면.

include_once("soapLib/nusoap.php");
include_once("soapLib/nusoapmime.php");

$server = new nusoapservermime();
$server->configureWSDL('getfile', 'urn:getfile');
$server->register('getfile', array("fileName"=>"xsd:String"), array("return"=>"xsd:String"), 'namespace', 'namespac#getfile');
$server->service($HTTP_RAW_POST_DATA);

요렇게 되겠네요.
여기서 끝이냐구요?
당연히 아니죠 -_-;;

function getfile($fileName){
  global $server;
  $server->getAttachments($HTTP_ROW_POST_DATA);
  foreach($server->requestAttachments as $value){
    $responseData[] = $value;
  }
 
  foreach($responseData as $key => $value){
    $fp = fopen("data/".$responseData[$key]['filename'], "a+");
    fwrite($fp, $responseData[$key]['data']);
    fclose($fp);
  }
 
  return "success";
}

register에서 정의한 함수명으로 함수를 하나 만드시고 받는값과 리턴값을 정의한대로
함수를 만드시면 됩니다. 위의 함수에서 궂이 설명이 필요한부분은

$server->getAttachments($HTTP_ROW_POST_DATA);
  foreach($server->requestAttachments as $value){
    $responseData[] = $value;
  }
이부분이죠.
이건 Mail Mime으로 받은 xml과 그 밑에 첨부된 파일들을 쪼개는겁니다.
그리고 foreach로 돌면서 파일을 배열에 넣는거죠.

생각외로 간단하군요 -_-;;
그럼, 서버 구축은 끝입니다.
(벌써?)

그럼 확인해보시면 됩니다.
전 url이 이렇게 되네요

http://eisemheim.com/_sample/soap/soapServer.php

접속하셔서 저랑 비슷한 화면이 나오는지 보시고
안나온다면 다시처음부터 차근차근..
그래도 안나오면 개별면담 요청하세요 -_-;;




이번에는 클라이언트를 구축해보겠습니다.

[soapClient.php]

require_once("soapLib/nusoap.php");
require_once("soapLib/nusoapmime.php");
역시나 nusoap라이브러리를 인클루드 합니다.

$client = new soapclientmime('http://eisemheim.com/_sample/soap/soapServer.php?wsdl', true);
클라이언트 객체를 생성합니다.
인자값으로 soap서버의 wsdl주소를 주면 됩니다.
wsdl주소는 어디냐구요?
soap서버 구축해놓은 파일명뒤에 ?wsdl붙이시면 거기가 wsdl주소입니다.

$client->setHTTPEncoding('deflate, gzip');
HTTP규격에 맞는 인코딩을 선언합니다.


$fp = fopen("test.mp3","rb");
while(!feof($fp)){
  $file .= fgets($fp);
}
리드 바이너리로 첨부할 파일을 읽어주세요

$cid = $client->addAttachment($file,"받아라.mp3");
척보시면 알겠지만 Attachment를 추가합니다.
Attachment가 뭐냐구요? mime 파트를 추가한다고 생각하시면 됩니다.
첫번째 인자값은 파일 자채이고, 두번째는 파일명입니다.

$result = $client->call('getfile',array("fileName"=>"받아라.mp3"));
call~! 서버를 불러주세요~

getfile라는 함수를 실행시켜주시고, 첫번째 인수로 fileName라는 변수에 '받아라.mp3'라는 값을 보냅니다.

그럼 클라이언트도 끝났네요~

require_once("soapLib/nusoap.php");
require_once("soapLib/nusoapmime.php");
$client = new soapclientmime('http://eisemheim.com/_sample/soap/soapServer.php?wsdl', true);
$client->setHTTPEncoding('deflate, gzip');
$fp = fopen("test.mp3","rb");
while(!feof($fp)){
  $file .= fgets($fp);
}
$cid = $client->addAttachment($file,"받아라.mp3");
$result = $client->call('getfile',array("fileName"=>"받아라.mp3"));

이러면 끝난겁니다 -_-;;

헌대...
이렇게 해놓으면 결과를 모르잖아요?
echo '

Request

' . htmlspecialchars($client->request, ENT_QUOTES) . '
';
echo '

Response

' . htmlspecialchars($client->response, ENT_QUOTES) . '
';
echo '

Debug

' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

디버그입니다.

자채 테스트를 해본결과 30mb까지 전송해봤습니다.
단, php.ini 에서 max_execution_time = 0; 으로 설정하셔야합니다.
인내심만 있으면 무재한으로 갈듯합니다 -_-;;

첨부파일 보시고 참고하세요.

그럼.. 이만.. -_-/




PS. http://eisemheim.com/_sample/soap/soapServer.php << 이쪽으로 파일 전송하시면 혼납니다 -┏


Posted by 알 수 없는 사용자
,