친절한 답변 정말 감사 만땅 합니다.
하여튼 해결이 되서 정말 기분이 너무 좋습니다.
유영인님과 문환님 정말 감사합니다.
그럼...
유영인 Cuperido 님이 쓰신 글 :
: 문환님께서 너무 잘 설명을 해주셔서 거의 답이 나온것 같은데,
: 나도초짜님께서 접근 하실때 도움이 되실것 같아 몇가지 이론적 설명을 덧붙여드립니다.
:
: 우선, 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;
: : : : : }