문환님께서 너무 잘 설명을 해주셔서 거의 답이 나온것 같은데,
나도초짜님께서 접근 하실때 도움이 되실것 같아 몇가지 이론적 설명을 덧붙여드립니다.
우선, NMHTTP의 저장 방법은
String = NMHTTP->Get(...); 이런식으로 호출을 해서 바로 때려넣으실 수 있습니다.
Indy는 스트림을 이용해서 저장해야 하는 방식인데 반하여 NMHTTP는 바로 스트링으로
뽑아낼 수 있다는 편리함이 있어 저도 초반에는 많이 사용을 했었지만, 안정성이 좋지
않아 솔직히 별로 권해 드리고 싶지 않습니다.
그리고 말씀해주신 사이트는 파일을 바로 링크 시킨것이 아니라, 직접 서버측에서 헤더를
만들고 데이터를 뿌려주는 형태입니다. 파일 이름이 그래서 계속 변형되는 것입니다.
HTTP데이터에서는,
[헤더]
----------
[데이터]
이렇게 데이터가 출력되는데, 위에 있는 헤더 부분에 파일이름, 파일크기, 파일형식 등이
전부 보내어집니다. Get해서 얻어지는 것은 아래 데이터 부분이며, ExtraHeaders 에서
얻어지는 것은 헤더 부분입니다.
헤더 부분에서 파일이름을 얻어와서 그 파일 이름 그대로 저장을 하는 방식을 문환님께서
작성해 주신 것입니다.
아마도 ExtraHeaders문제는 Indy 버젼에 따른 차이 같습니다.
만약, 다시 설치하시기가 귀찮으시다 하더라도,
String content_disp = IntToStr(GetTickCount());
뭐 이정도로 파일 이름을 변형해서 저장하거나 아니면, 시간에 따라서 저장을 해주는
그런 루틴을 추가하신다면 나도초짜님께서 관리 하시기가 더욱 수월하실것 같습니다.
cuperido
나도초짜 님이 쓰신 글 :
: 친절하게 답변을 주어서 너무 고맙습니다/
:
: 제가 Indy 컴포넌트가 없어서 Components 페이지에서 다운후
: 설치하여 Test했는데..
:
: String content_disp = IdHTTP1->Response->ExtraHeaders->Values["Content-Disposition"];
:
: 컴파일시 이 행에서 ExtraHeaders is not a member of 'TIdResponseHeaderInfo' 란
: 에러가 뜹니다.
:
: 그래서 보니까 IdHTTP1->Response 의 프로퍼티에 ExtraHeaders 란 항목이 없더라구요.
: 어떻게 하면 좋을지... ^^
:
: 그래서 생각한게
: 그냥 기본 NMHTTP 컴포넌트를 사용하게하였는데..
: Get을 호출한다음 얻어지는 Data를 어떻게 저장해야 되는지를
: 모르겠네요...
:
: 하여튼 답변 주셔서 감사합니다.
:
:
:
:
: 임문환.실업자 님이 쓰신 글 :
: : Indy의 TIdHTTP 입니다.
: : 컴포넌트 팔래트의 Indy Clients 페이지에 있습니다.
: : 어떤 버전부터인가는 잘 모르나 C++Builder에 기본으로 제공되는 것으로 알고 있습니다만...
: :
: :
: : 나도초짜 님이 쓰신 글 :
: : : 진짜루 고맙습니다.
: : :
: : : 그런데..
: : : IdHTTP1->Get("
Http:://"+Host+CGI+"?"+Params,pMStream);
: : : 에서 IdHTTP1 는 TNMHTTP 컴포넌트를 포함하는걸 나타내나요?
: : : 이걸루 포함시키니까 컴파일 할때 에러나오던데..
: : :
: : : 제가 너무 초짜라 죄송합니다.
: : : 이제 거의 99%까지 온거 같으니까 한번만 더 알려 주세요..
: : : 그럼 꾸벅...
: : :
: : :
: : : 임문환.실업자 님이 쓰신 글 :
: : : : 나도초짜 님이 쓰신 글 :
: : : : : 안녕 하세요..
: : : : : 초보적인 질문인지는 모르겠는데 모르니까 무지 답답하네요..
: : : : :
: : : : : WebBrowser 에서 Navigate로 웹페이지 하나를 지정해서 접속을 했는데..
: : : : :
: : : : : 거기에보면 다운로드 버튼이 하나 있는데 이버튼을 눌러서 해당 파일을
: : : : : 자동으로 받는 프로그램을 만들고 싶어요...
: : : : :
: : : : : 그런데 Text 소스를 보니 이 버튼을 누르면 아래 행을 실행하게 되어 있더라구요..
: : : : : function excel_save() {
: : : : : document.all.excel_iframe.src="ma_st_item_con_lst_viw_excel.jsp?indx_cd=&indx_ind_cd=&cur_pr=&cur_pr_type=&cur_pr1=&cur_pr2=&tr_vl=&tr_vl_type=&tr_vl1=&tr_vl2=&isu_stat=1&isu_stat_type=1&woo=&woo_type=&too_type=&too_type1=&too_type2=&too_type3=";
: : : : : }
: : : : :
: : : : : 이걸 어떻게 전달을 하여 실행을 할수 있을지..
: : : : :
: : : : : PostData를 지정하는것같은데.. PostData 함수까지는 구현 하였는데..
: : : : : PostData로 도데체 뭘 넘겨 줘야할지를 모르겠네요..
: : : : :
: : : : : 고수님들의 답변좀 부탁 드립니다.
: : : : :
: : : : : 그럼 꾸벅..
: : : :
: : : :
: : : : 간단한 예를 들면 아래와 같이 할 수 있습니다.
: : : :
: : : : Params의 각 항목의 값을 분리해서 지정해야 할텐데요 그것은 별로 어려운 작업이 아닙니다.
: : : : (분리해서 지정한 다음 다시 아래의 형식으로 합쳐야 겠지요)
: : : : 분리해서 지정하려면 각 항목의 의미를 알아야 가능한데요.
: : : : 그 것은 해당 URL의 결과 HTML 소스에서 해당 Form 영역을 살펴보면 답이 다 나와 있습니다.
: : : : 예를 들어, '종합주가지수'라고 초기에 표시되는 항목의 이름은 indx_ind_cd이고
: : : : 그것에 지정할 수 있는 값은 01 에서 40 ('종합주가지수'~'배당지수')까지인 것을 알 수 있습니다.
: : : :
: : : : String Host("www.kse.or.kr");
: : : : String CGI("/webkor/market/st/item/con/ma_st_item_con_lst_viw_excel.jsp");
: : : : String Params("indx_cd=1&indx_ind_cd=01&cur_pr=&cur_pr_type=&cur_pr1=&cur_pr2=&tr_vl=&tr_vl_type=&tr_vl1=&tr_vl2=&isu_stat=&isu_stat_type=&woo=&woo_type=&too_type=&too_type1=&too_type2=&too_type3=");
: : : :
: : : : void __fastcall TForm1::btnGetClick(TObject *Sender)
: : : : {
: : : : Screen->Cursor = crHourGlass;
: : : : TMemoryStream *pMStream = new TMemoryStream;
: : : : IdHTTP1->Get("
Http:://"+Host+CGI+"?"+Params,pMStream);
: : : : IdHTTP1->Response->ExtraHeaders->CaseSensitive = false;
: : : : //Content-Disposition: attachment; filename=20040917165039_file.xls
: : : : String content_disp = IdHTTP1->Response->ExtraHeaders->Values["Content-Disposition"];
: : : : String file_name;
: : : : int idx = content_disp.LowerCase().Pos("filename=");
: : : : if(idx>=1)
: : : : {
: : : : file_name = content_disp.SubString(idx+9,content_disp.Length());
: : : : if(file_name.IsEmpty()==false)
: : : : {
: : : : TFileStream *pFStream = new TFileStream(file_name,fmCreate|fmShareDenyWrite);
: : : : pFStream->CopyFrom(pMStream,0);
: : : : delete pFStream;
: : : : }
: : : : }
: : : : delete pMStream;
: : : : Screen->Cursor = crDefault;
: : : : }