sql server存取文件,存前用delphi自带的压缩单元zlib对文件进行压缩,读取的时候解压缩,但是图片文件(jpg,jpeg,bmp,icon等),在image上显示总是出错,论坛上搜索了很多帖子,也解决不了!不知道各位有何高招,还有就是对于存放的word,excel等文件,怎么读取(不允许用户拷贝文件)。

解决方案 »

  1.   

    对于存储图的问题,我想应该是你没有使用相符的类型去读取吧,因为在这种操作上面,TImage似乎不会自动帮你识别类型。至于面那个问题,希望详细描述一下到底想做什么希望达成什么样的效果。
      

  2.   

    word,excel,cad读取出来后能够正确显示,但是不能修改,拷贝,exe等程序则可以打开,执行
      

  3.   

    试了一下,如果图片不经过压缩和解压缩就能够显示,但是经过压缩和解压缩后,显示错误Jpeg error #51,#42之类的错误,不知道有何解决办法,如果图片不经过压缩就存放到数据库的话,数据库的容量将特别大
      

  4.   

    但是经过压缩和解压缩后,显示错误Jpeg error #51,#42之类的错误,
    存储存在问题,如果愿意就贴出数据库存储代码,我帮你改
      

  5.   

    const cBufferSize = $4096;function TModuleFm.StreamCompression(mInputStream: TStream; mOutputStream: TStream): Integer;
    var
      I: Integer;
      vBuffer: array[0..cBufferSize]of Char;
    begin
      Result := -1;
      if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;
      with TCompressionStream.Create(clMax, mOutputStream) do try
        for I := 1 to mInputStream.Size div cBufferSize do begin
          mInputStream.Read(vBuffer, cBufferSize);
          Write(vBuffer, cBufferSize);
        end;
        I := mInputStream.Size mod cBufferSize;
        if I > 0 then begin
          mInputStream.Read(vBuffer, I);
          Write(vBuffer, I);
        end;
      finally
        Free;
      end;
    end; { StreamCompression }function TModuleFm.StreamDecompression(mInputStream: TStream; mOutputStream: TStream): Integer;
    var
      vBuffer: array[0..cBufferSize]of Char;
      I: Integer;
    begin
      Result := -1;
      if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;
      with TDecompressionStream.Create(mInputStream) do try
        repeat
          I := Read(vBuffer, cBufferSize);
          mOutputStream.Write(vBuffer, I);
        until I = 0;
        Result := mOutputStream.Size;
      finally
        Free;
      end;
    end; { StreamDecompression }存储文件(图片,其他任何格式的文件,都用流存储,读出来则根据字段‘fileext’来分类处理)
    if ModuleFm.OpenDialog.Execute then
      begin
         InputStream:=TFileStream.Create(ModuleFm.OpenDialog.FileName,fmOpenRead);
         OutputStream:=TMemoryStream.Create;
          try
           ModuleFm.StreamCompression(InputStream,OutputStream);
             ModuleFm.M_FileReg.Close;
             ModuleFm.M_FileReg.Open;
             ModuleFm.M_FileReg.Append;
             ModuleFm.M_FileReg.FieldByName('ID').AsInteger:=integer(tree.Selected.Data);
            ModuleFm.M_FileReg.FieldByName('FileName').AsString:=ExtractFileName(ModuleFm.OpenDialog.FileName);
             OutputStream.Position:=0;         TBlobField(ModuleFm.M_FileReg.FieldByName('image')).LoadFromStream(InputStream);
             ModuleFm.M_FileReg.Post;
    finally
            InputStream.Free;
            OutputStream.Free;
           end;
    end;
    //取图片
    var
    Stream1,stream2:TmemoryStream;
    FJpegImage:TJpegImage;
    begin
    ModuleFm.M_FileReg.Close;
    ModuleFm.M_FileReg.SQL.Clear;
    ModuleFm.M_FileReg.SQL.Add('select * from M_FileReg where filename='+#39+tree.Selected.Text+#39'');
    ModuleFm.M_FileReg.SQL.Add('and id='+inttostr(integer(tree.Selected.Parent.Data))+'  and fileext=’+’jpg’+’');
    ModuleFm.M_FileReg.Prepared;
    ModuleFm.M_FileReg.Open;     if  ModuleFm.M_FileReg.FieldByName('image').IsNull then   exit;     Stream1:=TMemoryStream.Create;
         Stream2:=TMemoryStream.Create;
         FJpegImage:=TJpegImage.Create;
          TBlobField(ModuleFm.M_FileReg.FieldByName('image')).SaveToStream(stream1);
          stream1.Position := 0;
         ModuleFm.StreamDecompression(stream1,stream2);//将stream1解压缩到stream2
          stream2.Seek(0,0);//stream2.position;=0;
          FJpegImage.LoadFromStream(stream2);
          TJpegImage(Image.Picture).Assign(FJpegImage);
    End;
      

  6.   


    var
      StringStream : TStringStream;//存储文件(图片,其他任何格式的文件,都用流存储,读出来则根据字段‘fileext’来分类处理)
    if ModuleFm.OpenDialog.Execute then
      begin
         InputStream:=TFileStream.Create(ModuleFm.OpenDialog.FileName,fmOpenRead);
         OutputStream:=TMemoryStream.Create;   //
         StringStream:=TStringStream.create;
          try
             ModuleFm.StreamCompression(InputStream,OutputStream);
             ModuleFm.M_FileReg.Close;
             ModuleFm.M_FileReg.Open;
             ModuleFm.M_FileReg.Append;
             ModuleFm.M_FileReg.FieldByName('ID').AsInteger:=integer(tree.Selected.Data);
             ModuleFm.M_FileReg.FieldByName('FileName').AsString:=ExtractFileName(ModuleFm.OpenDialog.FileName);
             StringStream.CopyFrom(OutputStream,OutputStream.Size);//InputStream为
             ModuleFm.M_FileReg.FieldByName('image')).LoadFromStream(StringStream);
             ModuleFm.M_FileReg.Post;
          finally
            freeandnil(InputStream);
            freeandnil(OutputStream.Free);
            freeandnil(StringStream); 
          end;
    end;
      

  7.   

    StringStream.CopyFrom(OutputStream,OutputStream.Size);//InputStream为入库的压缩文件的流
    我不知道是那一个
      

  8.   

    哪个你不知道啊?
    StreamCompression(inputstream,outputstream);//压缩流
    StreamDeCompression(inputstream,outputstream);//解压流
    存储文件没有问题,关键是从数据库读出来以后就会先解压缩,然后在显示图片,图片的显示过程出错了!
      

  9.   

    是不是因为stream1,stream2同为内存流,导致数据无法写如stream2?我测试了一下,好象是stream2的size 为0。
      

  10.   

    先压缩后
    OutputStream.SaveToFile //看文件的大小入库
    再库中读
    TBlobField(ModuleFm.M_FileReg.FieldByName('image')).SaveToFile //看文件的大小
    看有没有问题(有问题就是入库的问题)如果没有然后解压
    解压有是不是和原来文件一样大(有问题就是解压的问题)
    如果一样大就没有理由错误