ورود

View Full Version : دانلود عکس



seven_point
چهارشنبه 29 اردیبهشت 1389, 02:15 صبح
من یه عکس رو توسط سوکت در دلفی دانلود میکنم و توی memorystream میریزم و وقتی اونو توی یه فایل SAVE میکنم response کدهای برگشتی مانند :



HTTP/1.1 200 OK
Connection: close
مانع از نمایش عکس میشن و باید این کدها رو از اول فایل با Notepad++ پاک کنیم تا عکس نمایش داده بشه.

آیا Unit خاصی برای حذف response کدهای برگشتی از سرور توی دلفی وجود داره؟
قبل از ذخیره فایل از دستور :


MemOut.Seek(200,soFromBeginning);
MemOut.SaveToFile('1.bmp');
MemOut.Free
استفاده میکنم ولی باز هم از بایت اول توی فایل ذخیرش میکنه.چرا؟

vcldeveloper
چهارشنبه 29 اردیبهشت 1389, 20:56 عصر
من یه عکس رو توسط سوکت در دلفی دانلود میکنم و توی memorystream میریزم و وقتی اونو توی یه فایل SAVE میکنم response کدهای برگشتی مانند
اینها توی header بسته های HTTP درج میشند. کدی که برای دریافت تصویر نوشتید دقیقا چی هست؟

seven_point
پنج شنبه 30 اردیبهشت 1389, 23:28 عصر
سلام.
اول این پاکتها رو ارسال میکنم :


s := 'GET ' + strRemoteFileName + ' HTTP/1.0'#13#10 +
'Host: ' + strHost + #13#10 +
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2)
'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10+
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+ #13#10+
'Keep-Alive: 300'+ #13#10+


و سپس فایل رو دانلود میکنم.ولی وقتی فایل رو دانلود میکنم اول فایل هدرهای HTTP اضافه میشه که مانع از نمایش عکس میشه.

ایا راهی داره اونو حذف کرد؟
یا راهی هست که از اول Memorystream چند خط رو به دلخواه حذف کرد و بعد در یک فایل ذخیره کرد؟

vcldeveloper
جمعه 31 اردیبهشت 1389, 02:57 صبح
اول این پاکتها رو ارسال میکنم
همچنان کدی که برای دریافت تصویر نوشتید را درج نکردید، بلکه فقط رشته ارسالی را درج کردید!

با چی درخواست را ارسال می کنید؟ می تونید با استفاده از یک IdHttp و استفاده از متد Get آن درخواست را برای سرور ارسال کنید، و مقدار خروجی را به صورت IdHttpResponse دریافت کنید.

seven_point
جمعه 31 اردیبهشت 1389, 11:45 صبح
آخه میخوام از idhttp استفاده نکنم و با ClientSocket این کار رو بکنم آخه انعطاف پذیر تر هست.

اینم کد کاملش:


function PIC(host, rfile, lfile: string;
csocket: Tcsocket):String;
var
rreturn,x: Integer;
s: string;
buffer: array[0..128] of Char;
MemOut:TMemoryStream;
begin
if rfile[1] <> '/' then
rfile := '/' + rfile;
MemOut:=TMemoryStream.Create;
try
with csocket do
begin
Host := host;
ClientType := ctBlocking;
Port := 80;
try
Open;
s := 'GET ' + strRemoteFileName + ' HTTP/1.0'#13#10 +
'Host: ' + strHost + #13#10 +
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2)'+
'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'+ #13#10+
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+ #13#10+
'Keep-Alive: 300'+ #13#10+

rreturn := Socket.SendBuf(Pointer(s)^, Length(s));
if rreturn > 0 then
begin
while (rreturn > 0) do
begin
rreturn := Socket.ReceiveBuf(buffer, SizeOf(buffer));
if rreturn > 0 then
MemOut.Write(buffer, rreturn);
end
end
end
close;
except
end;
end;
finally
end;
MemOut.Seek(200,soFromBeginning);
MemOut.SaveToFile('1.bmp');
MemOut.Free
end;
چرا این دستور :


MemOut.Seek(200,soFromBeginning);
کار نمیکنه و 200 کارکتر رو از اول فایل حذف نمیکنه؟

seven_point
جمعه 31 اردیبهشت 1389, 19:13 عصر
زمانی که توی متغیری از نوع TStringlist هم فایل رو دانلود میکنم نمیتونه دست تمام بایتها رو ذخیره کنه پس مجبورم از Stream ها استفاده کنم.
یعنی نمیشه HTTP Response رو از اول فایلهایی که اینجوری دانلود میشن حذف کرد؟

vcldeveloper
جمعه 31 اردیبهشت 1389, 20:44 عصر
آخه میخوام از idhttp استفاده نکنم و با ClientSocket این کار رو بکنم آخه انعطاف پذیر تر هستچیه ClientSocket از IdHttp انعطاف پذیر تر هست؟! هم از IdHttp قدیمی تره، هم باگ بیشتری داره.

به شکل زیر عمل کنید:
function HttpSaveFile(const RemoteFileName, LocalFileName: string): Boolean;
var
AResponse : TMemoryStream;
Http : TIdHTTP;
begin
Http := TIdHTTP.Create();
try
AResponse := TMemoryStream.Create;
try
Http.Request.Accept := 'text/xml,application/xml,application/xhtml+xml,' +
'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
Http.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2)';
Http.Request.CharSet := 'ISO-8859-1,utf-8;q=0.7,*;q=0.7';
Http.Request.CustomHeaders.AddValue('Keep-Alive','300');
Http.Get(RemoteFileName, AResponse);
Result := (Http.ResponseCode = 200);
if Result then
AResponse.SaveToFile(LocalFileName);
finally
AResponse.Free;
end;
finally
Http.Free;
end;
end;

پارامتر اول آدرس کامل فایلی هست که باید دانلود بشه، پارامتر دوم هم آدرس کامل نام فایلی هست که باید ذخیره بشه.

seven_point
جمعه 31 اردیبهشت 1389, 21:22 عصر
بله فکر میکنم قابل انعطاف تر باشه ولی مثل اینکه مجبور هستم از این کامپوننت استفاده کنم نه؟
از بابت لطف شما بسیار متشکرم.

vcldeveloper
شنبه 01 خرداد 1389, 04:41 صبح
بله فکر میکنم قابل انعطاف تر باشه ولی مثل اینکه مجبور هستم از این کامپوننت استفاده کنم نه؟
IdHttp قابلیت های بیشتری نسبت به ClientSocket داره، به خصوص که اساسا برای کار با پروتکل HTTP طراحی شده. استفاده از IdHttp بر ClientSocket ترجیح داره.