我用这个
VCLZIP.v3.06.2
没有问题。

解决方案 »

  1.   


    我下载了这个控件,调用的是 ZLibDecompressString这个函数,但是还是报错,会不会是我的数据格式
    有问题
      

  2.   

    不知道咱们用的是不是一个东东
    我是uses lvkZLibUtils;mHtmlText := mHttp.Get(murl);
    if mHttp.Response.ContentEncoding = 'gzip' then
          mHtmlText := gZipDeCompress(mHtmlText);
     
      

  3.   


    我是用internetreadfile获取源码的,试过用IDHTTP获取GZIP格式后能成功解压,而用自己写的
    函数却提示data error,现贴出源码,请大家帮忙看看是什么问题function HttpGetString(mUrl , mReferer: string ; var mStringResult : string; mMethod : string;bGzip : boolean) : boolean;
    var
      hSession,   hConnect,   hRequest:   hInternet;
      HostName,   FileName, mData:   String;
      f:   File;
      Buf:   Pointer;
      dwBufLen,   dwIndex:   DWord;
      Data:   Array[0..1024] of Char;//Array[0..$400]   of   Char;
      TempStr:   String;
      RequestMethod:   PChar;
      InternetFlag:   DWord;
      AcceptType:   LPStr;
      mResult : boolean;
      mFileSize : integer;
      mBinaryData : boolean;
      BytesToRead,   BytesReaded:   DWord;
      p : integer;  procedure ParseURL(URL: String; var HostName, FileName: String);  //取得精确的服务器名字,和地址文件
        //HTTP://<IP 地址>/[端口号]/[路径][?<查询信息>]
        procedure ReplaceChar(c1, c2: Char; var St: String);
        var
          p : Integer;
        begin
          while True do
          begin
            p := Pos(c1, St);
            if  p = 0 then
              break
            else
              St[p] := c2;
          end;
        end;  var
        i : Integer;
      begin
        if Pos('http://', LowerCase(URL)) <>  0 then
          System.Delete(URL, 1, 7);
        i := Pos('/',   URL);
        HostName := Copy(URL, 1, i);
        FileName := Copy(URL, i, Length(URL) - i + 1);    if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
          SetLength(HostName,   Length(HostName)   -   1);
      end;  procedure CloseHandles;  //5, 最后依次关闭request,connect,session句柄
      begin 
        InternetCloseHandle(hRequest);
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hSession);
      end; begin
      try
        ParseURL(mUrl, HostName, FileName);
        //showmessage(HostName + '   ' + FileName);
        hSession := InternetOpen(PChar('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C)'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
        hConnect := InternetConnect(hSession, PChar(HostName), INTERNET_DEFAULT_HTTP_PORT, PChar(''), PChar(''),   INTERNET_SERVICE_HTTP,   0,   0);
        RequestMethod := PChar(mMethod);//('GET');   //
        InternetFlag := INTERNET_FLAG_RELOAD;//0;     //是否取用缓存  InternetFlag   :=   INTERNET_FLAG_RELOAD;
        AcceptType   :=   PChar('*/*');      //接受类型
        //3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;
        hRequest := HttpOpenRequest(hConnect,         //通过InternetConnect()函数调用返回的HINTERNET类型的句柄
                                    RequestMethod,    //该参数是一个指向包含请求所使用的动词的字符串,如果为NULL,那么表示的是GET请求,可以选择有:
                                                              //GET:接收服务器发送的数据
                                                              //POST:向服务器发送执行的操作
                                                              //HEAD:接收服务器对请求的响应标题
                                                              //DELETE:删除服务器上的一个资源
                                                              //PUT:为服务器发送存储信息
                                                              //LINK:在URL之间建立连接
                                    PChar(FileName),  //表示操作的对象,一般情况下为一个要接收的文件的文件名
                                    'HTTP/1.1',       //表示所使用的HTTP协议版本。NULL值表示HTTP/1.0
                                    PChar(mReferer), //表示页的URL,lpszObjectName指定的信息存放在这个地址中
                                    @AcceptType,      //指定客户端可接受的信息类型。NULL则视为接收“text/*”类型,即文本类型
                                    InternetFlag,     //给出调用该函数的其他选项
                                    0);               //为异步I/O设置环境
              //HttpAddRequestHeaders(hRequest, 'Accept-Language: zh-cn',length('Accept-Language: zh-cn'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
              HttpAddRequestHeaders(hRequest, 'Connection: Keep-Alive',length('Connection: Keep-Alive'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
              //HttpAddRequestHeaders(hRequest, 'Content-Type: application/x-www-form-urlencoded;charset=utf-8',length('Content-Type: application/x-www-form-urlencoded;charset=utf-8'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
              if bGZip = True then
                HttpAddRequestHeaders(hRequest, 'Accept-Encoding: gzip, deflate',length('Accept-Encoding: gzip, deflate'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
              HttpAddRequestHeaders(hRequest, 'x-requested-with: XMLHttpRequest',length('x-requested-with: XMLHttpRequest'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
           //Content-Type
        //4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;//gzip, deflate
        HttpSendRequest(hRequest, //是HttpOpenRequest()函数调用返回的句柄
                        nil,      //此参数用来指定发送时附加的头,这个标题和请求一起被发送
                        0,        //标题的长度
                        nil,      //指向待发送的数据
                        0);        //待发送数据的长度    dwIndex     :=   0;
        dwBufLen   :=   1024;
        GetMem(Buf,   dwBufLen);
        //获取服务器对请求的响应信息
        mResult   :=   HttpQueryInfo(hRequest,     //是HttpOpenRequest()函数调用返回的句柄
                                      HTTP_QUERY_RAW_HEADERS_CRLF,//HTTP_QUERY_CONTENT_LENGTH,  //指定返回信息及返回的方式 (返回文件的大小)
                                      Buf,          //存放返回信息(指针)
                                      dwBufLen,     //返回信息的长度
                                      dwIndex);     //存放下一个匹配的标题索引值,如果找不到匹配的标题,那么此值将返回:ERROR_HTTP_HEADER_NOT_FOUND
           Form1.Memo3.Lines.Add(PChar(Buf));
      mData := PChar(Buf);
      p := pos('X-Last-Serial:',mData);
      if p <> 0 then
      begin
        system.Delete(mData,1,p+length('X-Last-Serial:')-1);
        pos('Content-Type:',mData);
        mData := Trim(copy(mData,1,pos('Content-Type:',mData)-1));
        s_A_SerialID := mData;
      end;
        mResult   :=   HttpQueryInfo(hRequest,     //是HttpOpenRequest()函数调用返回的句柄
                                      HTTP_QUERY_CONTENT_LENGTH,  //指定返回信息及返回的方式 (返回文件的大小)
                                      Buf,          //存放返回信息(指针)
                                      dwBufLen,     //返回信息的长度
                                      dwIndex);
            mBinaryData := false;
            if mResult or not mBinaryData then
            begin
              //mFileSize := StrToInt(StrPas(Buf));  //把文件长度付给FTFileSize  无用?
              BytesReaded := 0;
              mStringResult := '';
              //Form1.Memo3.Lines.Add('********************');
              while True do                             //死循环,不断读取网络文件数据
              begin
                BytesToRead := 1024;
                //Form1.Memo3.Lines.Add('********ReadFile********');
                if not InternetReadFile(hRequest,@Data,1024,BytesToRead)  then
                begin
                  mResult := False;
                  Break;  //如果网络读取字节流不成功,则退出循环
                end
                else
                begin
                  //Form1.Memo3.Lines.Add('********EndFile********');
                  if BytesToRead = 0 then
                  begin
                    mResult := False;
                    Break;      //如果读取数据为0,则跳出循环
                  end
                  else
                  begin
                    TempStr := Data;
                    SetLength(TempStr,BytesToRead);
                    mStringResult := mStringResult + TempStr;
                    inc(BytesReaded,BytesToRead);    //保存已经读取的总字节数
                    //Form1.Memo3.Lines.Add(FloatToStr(BytesToRead)+'     '+FloatToStr(BytesReaded));
                  end;
                end;
              end;
              SetLength(mStringResult,   BytesReaded);               //设置变量FTStringResult大小,
              mResult := BytesReaded <> 0;                   //保存结果
            end;
            //Form1.Memo3.Lines.Add('********END********');
            Result := mResult;
            FreeMem(Buf); //释放内存
            CloseHandles;
        except
          mResult := false;
          Result := mResult;
          //Form1.Memo3.Lines.Add(mUrl + '出错了');
        end; 
    end;
      

  4.   

    uses  IdZLibCompressorBase,IdCompressorZLib;
    type  IdCompressorZLib1: TIdCompressorZLib;
    过程中加入
    RS1 := TStringstream.Create('', 936); 
    IdHTTP1.Request.AcceptEncoding := 'identity';
    ..然后直接对RS1赋值即可 delphi xe5 成功解决