Q&A

  • idhttp에서 파일이 돌아올 때는 어떻게 해야 하나요.


http://bill.finance.sina.com.cn/bill/detail_js.php?stock_code=sh600690

이 url을 주소창에 넣고 치면 detail_js.php파일의 다운로드창이 뜹니다.
이 url을 urldownloadtofile함수에 넣어 detail_js.php을 다운로드할수는 있는데
stock_code가 수만개이고 홈피가 5~10초간격으로 갱신되므로 파일을 다운로드하고 다시 읽어서 분석할 여유가 없습니다.
post에 이 url을 쓰니까 다운로드창은 뜨지 않는데 돌아오는 스트링스트림이  비여있고
get에 쓰면 tntmemo에 이상한 문자렬이 뜹니다.
첨부파일의 그림은 다운로드한 파일의 내용과 메모리스트림에 읽어 save한 내용의 대비입니다.
그림상단은 ultraedit의 헥스에디터로 본것입니다.

시간이 촉박한 과제인데 무슨 방법이 없을가요?
고수님들 가르침을 기다립니다.

<!--CodeS-->
var
  Form1: TForm1;
  idhttp : TIdHTTP;
implementation
uses IdHTTP, IdMultipartFormData;

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  idhttp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    Font.Name := 'MS Shell Dlg 2'
  else
    Font.Name := 'MS Shell Dlg';
  idhttp := TIdHTTP.Create(nil);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  postdata: TIdMultiPartFormDataStream;
  recstream: TStringStream;
  url : string;
begin
  postdata := TIdMultiPartFormDataStream.Create;
  postdata.AddFormField('stock_code', 'sh600690');
  postdata.Position :=0;
  idhttp.Request.ContentType := postdata.RequestContentType;
  recstream := TStringStream.Create('');
  url := 'http://bill.finance.sina.com.cn/bill/detail_js.php';
  try
    idhttp.Post(url, postdata, recstream);
  finally
    mmo1.Lines.Add(recstream.DataString);
    ShowMessage('Post End');
  end;
  recstream.Free;
  postdata.Free;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  recstream: TStringStream;
  url : string;
begin
  recstream := TStringStream.Create('');
  url := 'http://bill.finance.sina.com.cn/bill/detail_js.php?stock_code=sh600690';
  try
    //mmo1.Lines.Add(idhttp.Get(url));
    idhttp.Get(url, recstream);
  finally
    mmo1.Lines.Add(recstream.DataString);
    ShowMessage('Get End');
  end;
  recstream.Free;
end;

<!--CodeE-->
1  COMMENTS
  • Profile
    steps 2008.05.25 01:17
    볼포럼의 DrK님께서 원인을 찾아주셨길래 여기에 적습니다.
    TNTmemo의 글자가 깨진것은 서버에서 HTML을 압축해서 돌려주기 때문이였습니다. 인디 10의 zlibcompress던지 그걸로 돌아오는 스트링스트림을 복호화하면 되더군요. 이번에 HTML에 대해 또 한수 배웠습니다.