ورود

View Full Version : مشکل در دریافت فایل باینری از کلاینت



m_farshad
پنج شنبه 25 خرداد 1391, 20:47 عصر
با سلام
من یه برنامه رو سیستم سرور دارم که میتونه عملیات فایل سرور رو انجام بده
هنگام ارسال فایل از کلاینت به سرور نمیتونم دقیقا همون فایل رو تو سرور بسازم
یعنی اندکی حجم فایل تغییر میکنه تو فایل های متنی مشکلی نیست و لی فایل باینری خراب میشه
کلاینت از idhttpclient استفاده میکنه فایل رو پست میکنه به سرور idhttpserver
اگه دوستان کمک کنن ممنون میشمprocedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
decoder, newdecoder: TIdMessageDecoder;
lEndOfMessage: boolean;
lFileStream: TFileStream;
boundary, startboundary, ln: string;
filepath:string;
begin
filepath:=GetCurrentDir+ARequestInfo.URI;
if ARequestInfo.PostStream <> nil then
begin
boundary := ExtractHeaderSubItem(ARequestInfo.ContentType, 'boundary',
QuoteHTTP);
startboundary := '--' + boundary;
repeat
ln := ReadLnFromStream(ARequestInfo.PostStream, -1, True);
until ln = startboundary;

decoder := TIdMessageDecoderMIME.Create(nil);
try
TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary;
lEndOfMessage := False;
repeat
decoder.SourceStream := ARequestInfo.PostStream;
decoder.FreeSourceStream := false;
decoder.ReadHeader;
case decoder.PartType of
mcptText, mcptAttachment:
begin
lFileStream := TFileStream.Create(filepath, fmCreate);
try
newdecoder := decoder.ReadBody(lFileStream, lEndOfMessage);
decoder.Free;
decoder := newdecoder;
finally
lFileStream.Free;
end;
end;
mcptIgnore:
begin
FreeAndNil(decoder);
decoder := TIdMessageDecoderMIME.Create(nil);
TIdMessageDecoderMIME(decoder).MIMEBoundary := boundary;
end;
mcptEOF:
begin
FreeAndNil(decoder);
lEndOfMessage := True;
end;
end;
until (decoder = nil) or lEndOfMessage;
finally
decoder.Free;
end;
end

m_farshad
شنبه 27 خرداد 1391, 08:57 صبح
از دوستان با تجربه اگه زحمتی نیست راهنمایی بفرمایید

Mask
یک شنبه 28 خرداد 1391, 18:07 عصر
علت استفاده از کامپوننتهای idhttp چیه؟
در شبکه هر پروتکل برای کاری ساخته شده. اولین و بزرگترین اشتباه شما ، استفاده از این بستر برای جابجایی فایل هست.
برای ارسال و دریافت فایل در شبکه ، جهت تسریع در امر ارسال و سلامت فایلهای ترانسفر شده . باید از پروتکل Tcp استفاده کنید.
این پروتکل جزو پروتکلهای تضمینی محسوب میشه. یعنی با دقت کامل فایل رو به مقصد میرسونه.
موفق باشید.

m_farshad
چهارشنبه 31 خرداد 1391, 20:02 عصر
ممنون از راهنمایی
یکی از مزایای idhttp قابلیت تفکیک ارتباط ها هست
میدونین نمیخواستم درگیر مدیریت ارسال همزمان بشم ولی تو این زمینه هم تجربه و شناخت خوبی ندارم
در ضمن آپلود فایل در کلیه سایتها با همین پروتکل انجام میشه یعنی کلاینت فایل رو برای سرور پست میکنه
با این توضیحات بازم فکر میکنین باید از tcp استفاده کنم؟

Mask
چهارشنبه 31 خرداد 1391, 20:30 عصر
با این توضیحات بازم فکر میکنین باید از tcp استفاده کنم؟
من که با این کامپوننت بدون مشکل دارم کار میکنم .
ممکنه کامپوننت idhttp این کار رو بکنه ، اما زیاد به نظرم منطقی نیست.

m_farshad
چهارشنبه 31 خرداد 1391, 20:43 عصر
من تو چند جا خوندم اگه در حین ارسال فایل با سوکت یه فایل دیگه هم ارسال بشه تو سرور فایلها با هم برخورد میکنن
یعنی باید مدیریت دریافت فایل داشته یاشیم تا بتونیم تفکیک شده فایل ها رو ذخیره کنیم
شما که تجربه بیشتری دارین تا حالا با این موضوع بر نخوردین؟
idhttp دارای روتین مولتی تردینگ هست یعنی زمان ارسال چند فایل تابع (IdHTTPServer1CommandGet) برای هر فایل به صورت جداگانه صدا زده میشود
راستش من تعصبی رو استفاده از این پروتکل ندارم و دنبال بهترین راه حل میگردم
ممنون از راهنمایی

Mask
چهارشنبه 31 خرداد 1391, 20:51 عصر
ممکنه سوکت این مشکل رو داشته باشه ، اما ایندی ،نه.
کامپوننت Tcpserver برای هر ارتباط یه ترد ایجاد میکنه و در هر ترد کانکشن رو مدیریت و حفظ میکنه.

m_farshad
چهارشنبه 31 خرداد 1391, 20:52 عصر
اگه زحمتی نیست
میتونین یه نمونه کد بزارید

Mask
چهارشنبه 31 خرداد 1391, 20:57 عصر
توی پستهام بگردین ، قبلا نمونه زیاد گزاشتم.