Pomysł
kinio w zupełności mi odpowiada. Nie miałem czasu się tym zając, więc takie gotowe rozwiązanie jest jak znalazł. Próbowałem czegoś podobnego ze zmienną char jako buforem, ale ograniczała mnie jej pojemność. Trochę liczyłem, że o czymś nie wiem i istnieje jakaś prosta funkcja, ale tak jest dobrze.
Przedstawiony kod chciałem wykorzystać, nie do zapisywania plików pobranych z sieci d pliku na dysku, lecz do wczytywania bezpośrednio z sieci do obiektu Image, dlatego nieco zmodyfikowałem kod
kinio:
- Kod: Zaznacz cały
// dołączamy do projektu bibliotekę urlmon.lib
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
AnsiString Url ="http://cyfbar.republika.pl/images/img1.jpg";
IStream* pStream;
URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0);
LARGE_INTEGER liZero = { 0 };
ULARGE_INTEGER CurPos;
pStream->Seek(liZero, STREAM_SEEK_CUR, &CurPos);
ULARGE_INTEGER SizeOfFile;
pStream->Seek(liZero, STREAM_SEEK_END, &SizeOfFile);
LARGE_INTEGER Pos;
Pos.QuadPart = CurPos.QuadPart;
pStream->Seek(Pos, STREAM_SEEK_SET, NULL);
void* data = new char[SizeOfFile.QuadPart];
pStream->Read(data, SizeOfFile.QuadPart, NULL);
std::auto_ptr<TMemoryStream>mStream(new TMemoryStream);
mStream->Write(data, SizeOfFile.QuadPart);
mStream->Position = 0;
String ext = ExtractFileExt(Url);
if(ext.LowerCase() == ".jpg")
{
std::auto_ptr<TJPEGImage> JImage(new TJPEGImage());
JImage->LoadFromStream(mStream.get());
Image1->Picture->Assign(JImage.get());
}
if(ext.LowerCase() == ".bmp")
{
std::auto_ptr<Graphics::TBitmap> Bmp(new Graphics::TBitmap());
Bmp->LoadFromStream(mStream.get());
Image1->Picture->Assign(Bmp.get());
}
delete [] data;
}
//---------------------------------------------------------------------------
umknęła mi przedstawiona możliwość: void* data = new char i próbowałem podobnie ala zamiast typu void używałem bezpośrednio char o zdefiniowanej wielkości maksymalna dopuszczalna 999999.
Jeżeli chodzi o ściąganie plików na dysk to istnieje prostszy sposób:
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
AnsiString Url ="http://cyfbar.republika.pl/images/img3.jpg";
URLDownloadToFile(0, Url.c_str(), "c:\\img3.jpg", 0, 0);
}
//---------------------------------------------------------------------------