برای دریافت فایل عکس از روی سرورهای ویندوزی ، 3 روش خوب و کار آمد هست.فعلا کاری به sql نداریم.
1-مدیریت ارسال و دریافت فایل توسط فایل استریم: که در این روش به علت اینکه مدیریت ارسال و دریافت کاملا با عهده برنامه نویس هست و همچنین ارسال و دریافت در یک کانکشن و خاصیت ادامه دانلود به صورت ذاتی وجود ندارد ، اصلا پیشنهاد نمیشود. که در این روش باید از پروتکلهای TCP و یا UDP استفاده کنیم.
2-ارسال توسط وب سرور و دریافت در برنامه : در این روش هم ، مانند روش اول به صورت فایل استریم عکس و فایل ارسال و دریافت میشود، اما با این تفاوت که برنامه سمت سرور رو دیگه برنامه نویس مدیریت نمیکند و ، برنامه سمت سرور رو برنامه نویسان بزرگ کمپانی هایی مثل مایکروسافت زحمتش رو برامون میکشند. و از پروتکل http استفاده میشود.
این وب سرور ها (مانند IIS - Wamp _ Xamp ,...)امکانات بزرگی دارند که اگر بخواهیم در روش اول ، اون رو پیاده سازی کنیم ، زمان بسیار زیادی رو تلف کردیم. و باز هم به بهینه و اطمینانی که این وب سرورها دارند نمیرسیم.
امکانات :
1- خاصیت تکه تکه دیافت کردن فایل
2- خاصیت توقف و ادامه دریافت فایل
3- ایجاد محدودیت دریافت مقدار بسته های دریافتی
و...
3- ارسال و دریافت فایل توسط Ftp سرور :
در این روش هم باید یک Ftp سرور سمت سرور راه اندازی کرده و سپس درخواست دریافت فایل را از سمت کلاینت داده و استریم دریافتی را در شی ایمیج لود کنیم.
پیاده سازی :
روش اول : کافیه برنامه ای سمت سیستم دریافت کننده در حال اجرا باشد : روی پورتی که Listen هست، درخواست دریافت فایل رو گرفته و فایل رو دریافت میکند. و سیستم ارسال کننده هم اقدام به ارسال کند. توسط TCP
سمت ارسال کننده :
uses jpeg;
procedure TForm1.Button1Click(Sender: TObject);
var
TcpClient: TIdTCPClient;
MS: TMemoryStream;
begin
TcpClient := TIdTCPClient.Create();
MS := TMemoryStream.Create;
try
with TcpClient do
begin
port := 1010;
host := '127.0.0.1';
ReadTimeout := -1;
end;
TcpClient.Connect;
try
Ms.LoadFromFile('c:\1.jpg');
MS.Position := 0;
TcpClient.IOHandler.WriteLn(IntToStr(Ms.Size));
TcpClient.IOHandler.WriteBufferOpen;
TcpClient.IOHandler.Write(Ms);
TcpClient.IOHandler.WriteBufferClose;
finally
TcpClient.Disconnect;
end;
finally
TcpClient.Free;
MS.Free;
end;
end;
سمت دریافت کننده :
uses jpeg;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Jpg:TJPEGImage;
PicSize:Integer;
MemRecieveStreamPic:TMemoryStream;
begin
Jpg:=TJPEGImage.Create;
MemRecieveStreamPic:=TMemoryStream.Create;
try
PicSize :=strtoint( AContext.Connection.IOHandler.ReadLn());
AContext.Connection.IOHandler.ReadStream(MemReciev eStreamPic,PicSize,false);
MemRecieveStreamPic.Position:=0;
Jpg.LoadFromStream(MemRecieveStreamPic);
Image1.Picture.Bitmap.Assign(jpg);
finally
MemRecieveStreamPic.Free;
Jpg.Free;
end;
end;
روش دوم : در ابتدا باید یک وب سرور نصب و راه اندازی کنیم . که من IIS و یا Wamp رو پیشنهاد میکنم
پس از نصب ، و تنظیم پورت برنامه و Home Dir فایلهای مورد نظر را در پوشه های ایجاد شده در مسیر Home وب سرور قرار میدهیم.
بوسیله کامپوننت Idhttp عکس رو دانلود و در شی ایمیج مستقیما لود میکنیم.
uses JPEG,pngimage;
procedure ShowImageFromStream(AImage: TImage; AData: TStream);
var
JPEGImage: TJPEGImage;
begin
AData.Position := 0;
JPEGImage := TJPEGImage.Create;
try
JPEGImage.LoadFromStream(AData);
AImage.Picture.Assign(JPEGImage);
finally
JPEGImage.Free;
end;
end;
procedure ShowPngImageFromStream(AImage: TImage; AData: TStream);
var
pngimage: TPngImage;
begin
AData.Position := 0;
pngimage := TPngImage.Create;
try
pngimage.LoadFromStream(AData);
AImage.Picture.Assign(pngimage);
finally
pngimage.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
j: TJPEGImage;
begin
ms := TMemoryStream.Create;
try
IdHTTP1.Get(Edit1.Text, ms);
ShowPngImageFromStream(Image1, ms);
finally
ms.Free;
end;
end;
روش سوم :
uses jpeg;
procedure TForm1.Button1Click(Sender: TObject);
var
Ftp: TIdFTP;
MS: TMemoryStream;
Jpg:TJPEGImage;
begin
MS := TMemoryStream.Create;
Ftp := TIdFTP.Create(nil);
Jpg:=TJPEGImage.Create;
try
with Ftp do
begin
ProxySettings.ProxyType := fpcmNone;
ProxySettings.Port := 21;
Host := '127.0.0.1';
Username := 'username';
password := 'pass';
end;
Ftp.Connect;
try
Ftp.Get('127.0.0.1\Pic\1.jpg', MS);
MS.Position := 0;
jpg.LoadFromStream(MS);
Image1.Picture.Assign(jpg);
finally
Ftp.Quit;
Ftp.Disconnect
end;
finally
Ftp.Free;
MS.Free;
Jpg.free;
end;
end;
این هم آموزش یکی از قسمتهایی که قولش رو داده بودم.