Menu
Strona główna
Hacking
Programowanie
Telefonia Komórkowa
Kody do Gier
Linux
Dlaczego?
Programowanie w Delphi
Mapa strony
 Programy
Systemy
Artykuły PDF

Security

Skanery
Sniffery
Security

Windows

Użytkowe
Przegl±darki graficzne
Kodeki
Narzędzia plikowe
Narzędzia dyskowe
Narzędzia systemowe
Sterowniki
Szyfrowanie danych
Zarz±dzanie hasłami
Zarz±dzanie rejestrem
£aty i Patche
Zarz±dzanie pamięci±
Synchronizacja czasu
Nagrywanie płyt
Free Antivirus (Darmowe Antyvirusy)
Sterowniki
Obróbka d¼więku
Edycja wideo

Internetowe

Bezpieczeñstwo
Programy P2P
Komunikatory
Dodatki do przegl±darek
Klienty poczty elektronicznej
Narzędzia Antyspamowe
Przegl±darki grup dyskusyjnych
Przegl±darki Offline
Serwery poczty elektronicznej
Telefonia komórkowa
Wyszukiwarki internetowe
Zdalny dostęp
Cybernianie
Klienty FTP
Narzędzia internetowe
Prywatnośc
Przegl±darki internetowe
Serwery FTP
Serwery WWW
Wspomagacze ści±gania
Zarz±dzanie sieci± lokaln±

Tuning Systemu

Diagnostyka i testowanie
Inne
Rozszerzenia pulpitu
Tapety na pulpit
Tuning Systemu
Ikony
Powłoki
Tuning sprzętu
Wygaszacze ekranu

Programowanie

Kompilatory
Biblioteki i komponenty
Bazy danych
Edytory programistyczne
¦rodowiska programistyczne
Debugery
Tworzenie wersji instalacyjnych

Webmastering

Użytkowe
Kursy

Linux

Użytkowe
Internetowe
Multimedialne

Programy biurowe

Programy dla firm
Pakiety biurowe
Administracja
Edytory tekstu
Grafika prezentacyjna
Kadry i płace
Wspomaganie projektowania
Zarz±dzanie projektami
Bazy danych
Finanse i księgowośc
Handel
Programy ewidencyjne
Zarz±dzanie informacj± osobist± (PIM)
 Download GRY
Pelne Wersje GIER
 Artykuy > Programowanie w Delphi > Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2

Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2

 

W moim poprzednim artykule mówiłem o Komponentach ADO i jak użyć ich, by prowadzić transakcje bazy danych od naszego podania. Utworzyliśmy małe podanie, by uratować pliki bitmapy do bazy danych i odzyskaliśmy ich używających dane świadomy komponent TDBImage. W tym artykule nauczysz się jak uratować inne typy plików.

DBImage jest kompatybilny z bitmapami tylko tak, jeżeli chcesz uratować i odzyskać inne formaty obrazu jak JPEGs nie możesz użyć komponentu DBImage. Zamiast będziesz musiał użyć komponentu TImage i dodasz część JPEG do "używa" klauzuli części. Odkąd komponent TImage jest nie dane świadomy i nie jest link do pole kropelki w bazie danych, musimy wystawić obraz do pierwszego ładowania tego do przedmiotu strumienia i wtedy ratujemy dane strumienia do bazy danych.

Z tym zbliżyć się do nas próbuje zachować pliki jako surowe dwójkowe dane bez niepokojenia o formatu, do którego oni należą. Teraz, jeżeli mieliśmy użyć tego podejścia, by uratować JPEGs powinien nie poszerzamy zakres, by zawrzeć inne typy pliku także ? Pewnie, kiedy dany opcję, użytkownik może chcieć uratować GIF, pdf, doc i pliki typu zip także.

Ratujące Dwójkowe Pliki

Tak rozpocznijmy od ratowania dwójkowych plików do baza danych. Jako mógłbyś już zauważyć, że ratujemy pliki do BLOB (Dwójkowy Duży Przedmiot) pola. Pole BLOB są polem, które gromadzi duże kawały danych zmieniania formatów i niesprecyzowanej wielkości w przeciwieństwie do prostych typów danych.

Kolumna BLOB zachowuje dane jako dwójkowe sznury albo sznury bajtu i nie może zostać poszukana. Klasa TBlobField w Delphi może nie tylko zawrzeć nie opracowane dane arbitralnej długości ale też dostarcza metod, by zmanipulować surowymi dwójkowymi danymi i plikami. Na przykład możesz skopiować surowe dwójkowe dane między polem BLOB i dwójkowym plikiem przez dzwonienie metod klasy TBlobField. Jedna z tych metod klasy TBlobField jest "LoadFromFile" metodą, która może zostać zadzwoniony, by uratować dane od pliku do bazy danych bez dużo wysiłku. Możemy zmodyfikować przykładowy kod od poprzedniego artykułu, by zawrzeć tę metodę zamiast załadowywania obrazu do komponent DBImage.

begin
    OpenDialog1.Filter:='*.bmp|*.bmp';
   
if OpenDialog1.Execute then
 
    begin
        TBlobField(ADOTable1.FieldByName('Image')).
       
  LoadFromFile(OpenDialog1.FileName);
     
end;
 end;

Zrób pewny ustawiłeś ADOTable1, by wstawić tryb przez używanie DBNavigator i, gdy wyjścia OpenDialog klikają "" (tyknięcie) przycisk, by uratować wszystkie pole. Nawiguj zestaw danych; znajdziesz, że obraz, któremu wstawiłeś ostatnie robić wstyd na komponencie DBImage. Spróbowałem ratowanie plikom innego niż bitmapy używające tę samą metodę ale to nie pracowało; ani mógłbym znale¼ć jakąś informację dalej, czy to powinno. Może być mną nie poszukali pilnie wystarczająco ale nie zostałem dotyczony z zagadnieniem, odkąd zamierzałem użyć strumieni, by uratować pliki i odzyskać dla powodów wyjaśnię pó¼niej w tym artykule.

Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2 - Używając Strumienie, by uratować binaries

 

Strumienie są klasami, które mogą zostać użyty, by przeczytać od i napisać do różne media przechowywania jak pamięć, pliki, kropelki i wklęsłości. Wszystkie przedmioty strumienia w Delphi są potomkami abstrakcyjnej klasy TStream i dziedziczą większość jego metod i własności, ale każdy strumień może zająć się tylko pojedynczym typem mediów. Na przykład TfileStream może zostać użyty, by przeczytać i napisać do plików tylko.

Więc utworzymy przedmiot TFileStream, by chwilowo zgromadzić dane zanim to jest uratowane do bazy danych. Teraz dostańmy się do coding części. Na wydarzeniu ButtonClick Button1 stracimy OpenDlg, by pozwolić użytkownikowi wybrać plik, by załadować się i ten raz ustawimy filtr okienka dialogowego, by przyjąć wszystkie typy plików. Wtedy tworzymy przedmiot strumienia podający wybrany plik jako parametr, żeby plik teraz został załadowany do FileStream.

TBlobField ma metodę członka nazwaną "LoadFromStream" który może zostać użyty, by uratować dane od strumienia do pola kropelki. Zadzwoń "Poczta" metodę i jesteśmy zrobieni. Wybrany plik teraz jest uratowany w bazie danych jako Dwójkowy Duży Przedmiot (Kropelce). Jeżeli masz Kierownika Przedsięwzięcia SQL możesz stracić proste stwierdzenie SQL w Analizatorze Pytania SQL, by zobaczyć nie opracowane dane w siatce.

Tutaj jest kod, który ratuje plik do bazy danych.

Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2 - Odzyskując dane BLOB i ratując, by ułożyć dokumenty

Więc teraz szczęśliwie uratowaliśmy plik do bazy danych ale jak odzyskujemy to? Możesz użyć samego komponentu TADOTable, by znale¼ć pole albo zakwestionować dla zapisu przez komponent TADOQuery przez tracenie stwierdzenia SQL. Jednakże, wprowadzę komponent TADODataSet, który może odzyskać zapisy bezpośrednio od stołu albo od wielokrotnych stołów przez stwierdzenie SQL. Możesz być człowiekiem sukcesu do server

przez wyszczególnianie parametrów związku w jego "ConnectionString" własności ale, ponieważ powiedziałem wcześniejszy to jest zawsze wskazane, by być człowiekiem sukcesu przez pojedynczy komponent związku. W moim ostatnim artykule użyliśmy komponentu TADOConnection i utworzyliśmy sznur związku, by być człowiekiem sukcesu do serwera. Dodaj komponent TADODataSet do formy (uchwytny w paleta "dbGo") i ustaw jego " związek" własność do ADOConnection1.

Możemy zutylizować własność CommandText ADODataSet1, by stracić stwierdzenie SQL i uzyskać dostęp do dane w wróconym recordset przez uzyskiwanie dostępu do własności komponentu i metod. Dane w polu kropelki mogą zostać uratowane do jakiegoś pliku. Jeżeli masz kolumnę z informacją o typie pliku kiedy to zostało zapisane jako dane kropelki, możesz użyć informacji, by uratować dane do tego samego typu pliku znów. Tutaj jest kod próbki, by zaaportować recordset dopasowującego wartość wyznaczoną do zmiennego iPKey :

ADODataSet1.Connection:=ADOConnection1;
 ADODataSet1.CommandText:='Select * From ImgTbl Where PKey=:param0';
 ADODataSet1.Parameters.ParamByName('param0').Value:=iPKey;
 ADODataSet1.Open;
 TBlobField(ADODataSet1 .FieldByNam('Image')).SaveToFile
                               ('Img'+IntToStr(iPKey)+'.dat');

Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2 - Sprawdzając pierwsze 4 Bajty albo Magiczne Numery

W powyższym kodzie ratujemy dane do pliku z '.dat ' rozszerzenie. Mógłbyś uratować to z '.bmp ' rozszerzenie, jeżeli jesteś pewny, że to jest bitmapa. Jeżeli jesteś nie pewny ale zachowaj to jako bitmapę kiedy faktyczne dane są typu JPEG albo jakiegoś innego typu, uratowany plik będzie z mały czy inaczej użycie.

Muszę wyznać, że zostałem wetkany wtedy to przez pewien czas. Byłem świadomymi that plikami nieść ich podpisy z nich, których może zostać wyciągnięty na poziomie bajtu. Faktycznie systemy Unix nie wymagają rozszerzeń imienia pliku odkąd oni są poradzeni według "magicznego numeru" znalazł w nagłówku pliku. To jest wspólna wiedza, że pierwsze 16 bajtów obrazu JPEG zawiera informację o danych, którego to niesie ale nie znałem wartości, dla których powinienem poszukiwać. Otwierając kilka plików JPEG w Szesnastkowym Edytorze przestrzegłem, że pierwsze 4 bajty wszystkiego oni było identyczne i i wartości były "FFD8 FFE0." Szybkie poszukiwanie na sieci ujawniło, że to była magiczną liczbą plików z '.jpg ' rozszerzenie. Spróbowałem otwieranie różnych struktur pliku w Szesnastkowym Edytorze i szukanie ich magicznych numerów; prawie wszystkie pliki podobnego typu miały to sam dokładny pierwsze 4 bajty oprócz bitmap, które miały tylko 2 identyczne bajty.

Teraz, że wiemy jak zidentyfikować strukturę pliku od surowych dwójkowych danych, skupmy się dalej jak możemy użyć informacji, by odzyskać i uratować dane do pliku. Wcześniejszy użyliśmy TFileStream, by uratować plik do bazy danych ale to nie może zostać użyte, by odzyskać dane od bazy danych odkąd budowniczy TFileStream wymaga pliku jako parametr. Zapamiętaj, każdy potomek klasy TStream może przeczytać i napisać tylko do określonego typu mediów. Możesz utworzyć przykład TBlobStream albo TADOBlobStream używającego pole Kropelki jako parametr budowniczego i tworzysz przykład TFileStream i kopiujesz dane od BlobStream, albo używasz "SaveToStream" metody TBlobField, by uratować dane do przykładu TMemoryStream,. TMemoryStream może zostać użyty, by zgromadzić dane w dynamicznym buforze pamięci i dostarcza ułożyć dokumenty - like uzyskać dostęp do zdolności. Ponadto, jego budowniczy nie wymaga żadnych parametrów, których dostosowuje nas grzywna w tej chwili.

Tak dostańmy się wróć do kodowania. Już zamanifestowałem jak być człowiekiem sukcesu do bazy danych i odzyskałem jednego albo bardziej recordsets przez tracenie stwierdzenia SQL przez własność tekstu rozkazu komponentu ADODataSet. Więc następny krok miałby utworzyć przykład TMemoryStream przez dzwonienie jego budowniczego. Odkąd tworzymy przedmiot to będzie konieczne, by włożyć kod zajmujący się przedmiotem ostrożny spróbować / w końcu bloki, żeby przykład został uwolniony nawet, jeśli wyjątek jest podnoszony w spróbować blok. Przeczytać mój poprzedni artykuł Używający Próbują i W końcu Pomóc Zapobiec Wycieki Pamięci Podczas Dynamicznego Tworzenia Przedmiotu w Delphi, by wiedzieć, dlaczego spróbuj / w końcu stwierdzenia są ważne podczas tworzenia przedmiotu. Gdy przedmiot TMemoryStream został utworzony chcielibyśmy przydzielić dane temu przez dzwonienie metody SaveToStream TBlobField kiedy podając imię Pola jako parametr.

 TblobField(ADODataSet1.FieldByName('Image')).SaveToStream(MStream);

Teraz przychodzi interesująca część, która porównuje bajty z wiedzianymi magicznymi numerami różnych typów pliku. To byłoby dobry pomysł, by zadeklarować zmienne jako datatype WORD tylko, by upewnić się, że dokładnie 2 bajty jest skopiowane od strumienia. Metoda Przeszukiwania rusza kursor do wyszczególnionej pozycji w strumieniu; w naszym przypadku chcielibyśmy ustawić kursor na początku więc to będzie konieczne, by wyszczególnić, że początek wyrównał z Szukać metodę jako "soFromBeginning."

Aby przeczytać bajty od strumienia do zmiennej, zadzwonić metodę Czytania z zmiennym Sig1 jako bufor i Rachunek jako 2. aktualna pozycja kursora powinny teraz zostać wzrośnięte do 2 ale zrobić podwójnie pewny ustawiam pozycję kursora do 2 i czytam następne 2 bajty do innej zmiennej WORD, Sig2. Możesz położyć kod, który sprawdza dla magicznego numeru w pętli, by wielokrotnie parsować przez wszystko dane, ale każdy plik, który otworzyłem w Szesnastkowym Edytorze miał ich magiczny numer w początku więc jestem zainteresować się czytaniem pierwszych czterech bajtów tylko.

Teraz maszyny Intel używają małego formatu Endian, by przeczytać bajty. Co to właściwie znaczy jest, że bajty są przeczytane wstecz; FFD8 staje się D8FF. Więc przerabiamy nasze szesnastkowe magiczne numery, by przeczytać wstecz i wtedy porównujemy ich z wartościami zmiennych. Kiedy mecz jest znaleziony możesz uratować to do struktury pliku to pasuje i wtedy używa ShellExecute, by wypuścić to z zrzeszonym podaniem, albo możesz załadować to bezpośrednio od strumienia do jednego z komponentów, jeżeli to popiera format. Na przykład , jeżeli typ danych jest znaleziony, by być typu bitmapy możesz załadować to w komponencie obrazu przez dzwonienie metody

Image1.Picture.Bitmap.LoadFromStream (MStream);

Albo możesz utworzyć przedmiot JPEG i skopiować dane od strumienia i załadowujesz to na komponencie Obrazu. Faktycznie możesz zrobić dużo rzeczy z tym zależącym od twoich wymagań.

Ratując Obrazy i Dwójkowe Pliki do Bazy danych z Delphi 2 - Kod

W kodzie poniżej są trochę magicznych numerów popularnych struktur pliku, które znalazłem kiedy poruszając wokoło. Oni pracują świetnie dla mnie ale, jeżeli chybiałem something dać mi znać.

Tutaj jest pełny kod:

procedure TForm1.Button1Click(Sender: TObject);
var
 iPKey:integer;
 MStream:TMemoryStream;
 Sig1,Sig2:  WORD;  //16-bit unsigned integer  = 2 bytes
begin
 iPKey:=StrToInt(ediPKey.Text);
 ADODataSet1.Connection:=ADOConnection1;
 ADODataSet1.CommandText:='Select * From lmgTbl Where PKey=:param0';
 ADODataSet1.Parameters.ParamByName('param0').Value:=iPKey;
 ADODataSet1.Open;
 MStream:=TMemoryStream.Create;
 try
 TBlobField(ADODataSet1.FieldByName('Image')).SaveToStream(MStream);
    MStream.Seek(0, soFromBeginning);
    MStream.Read(Sig1,2);
    MStream.Position := 2;
    MStream.Read(Sig2,2);
    if (Sig1=$4D42) then  // little Endian format of the first 2 bytes of bitmap
     begin
       MStream.SaveToFile('Img'+IntToStr(iPKey)+'.bmp');
       ShowMessage('File saved as Bitmap');
     end
     else
      //ShowMessage('File is not Bitmap');
      if (Sig1 = $D8FF) and (Sig2 = $E0FF) then // little Endian format of the first 4 bytes of  JPEG
      begin
        MStream.SaveToFile('Img'+IntToStr(iPKey)+'.jpg');
        ShowMessage('File saved as JPEG');
      end
      else
       if (Sig1 = $4947) and (Sig2 = $3846) then // little Endian format of the first 4 bytes of GIF
        begin
        MStream.SaveToFile('Img'+IntToStr(iPKey)+'.gif');
        ShowMessage('File saved as GIF');
        end
         else
         if (Sig1 = $5025)and (Sig2 = $4644) then // // little Endian format of the first 4 bytes of PDF
         begin
        MStream.SaveToFile('Doc'+IntToStr(iPKey)+'.pdf');
        ShowMessage('File saved as PDF');
         end
         else
          if (Sig1 = $CFD0) and (Sig2 = $E011) then // // little Endian format of the first 4 bytes of DOC
        begin
        MStream.SaveToFile('Doc'+IntToStr(iPKey)+'.doc');
        ShowMessage('File saved as DOC');
        end
        else
          if (Sig1 = $4B50) and (Sig2 = $0403)  then // // little Endian format of the first 4 bytes of ZIP
        begin
        MStream.SaveToFile('Archive'+IntToStr(iPKey)+'.zip');
        ShowMessage('File saved as ZIP');
        end
         else
         begin        // unrecognized
        MStream.SaveToFile('File'+IntToStr(iPKey)+'.dat');
        ShowMessage('Unrecognized file format! '+#13+'saved with .dat extension');
        end;
     finally
  MStream.Free;
 end;
end;
end;

Danish Ahmed
Mindfire Solutions

DISCLAIMER: Zawartość dostarczona w tym artykule nie jest zagwarantowana albo jest gwarantowana przez Producenta Zrzucił, Inc. Zawartość dostarczona jest przeznaczona dla rozrywki i / albo edukacyjne cele żeby wprowadzić do pomysłów klucza czytelnika, pojęć i / albo przeglądy wyrobów. Jako taki to jest ciążące na czytelniku, by zatrudnić prawdziwy światową taktykę dla bezpieczeństwa i wprowadzania najlepszych praktyk. Jesteśmy nie odpowiedzialny za jakieś przeczące konsekwencje, który mogą być skutkiem wprowadzanie w życie jakąś informację zakopaną nasze artykuły albo podręczniki. Jeżeli to jest recenzja sprzętu komputerowego, to nie jest polecone, by otworzyć i / albo zmodyfikować twój sprzęt komputerowy.

komentarz[0] |

Copyright 2006 - 2007 E-comet.info. Wszelkie prawa zastrzeone.

programy,artykuy,gry online,teledyski,filmiki,smieszne reklamy,sterowniki,kodeki,programy,program,download, downloads,security,bramka sms, teledyski,antywirusy,darmowe free program,programy p2p,tapety,programy biurowe,programy dla firm,narzdzia dyskowe,edytory,gry strategiczne,gry przygodowe,gry sportowe, symulatory, gry rpg,gry karciane, gry zrecznosciowe. Zapraszamy.
0.024 |