View Full Version : بروز رسانی خودکار برنامه از سرور (دریافت آخرین ورژن برنامه از سرور توسط کلاینت ها)
hamid-nic
سه شنبه 28 مهر 1394, 13:36 عصر
سلام دوستان وقتتان بخیر
یه برنامه ای هست مال چندسال قبله و با دلفی 7 نوشته شده و تحت شبکه به این صورت که کلاینت ها فایل exe برنامه را دارند و از طریق sp های روی بانک سرور ارتباط برقرار می کنند و کارشون را انجام می دهند . و مستقیم به سرور دسترسی ندارند . حالا اگر تغییری توی فایل برناهم exe ایجاد شود به اجبار باید این فایل توی تمام client ها کپی بشه که با آخرین تغییرات کار کنند .
حالا سوالم :
میخام برنامه را تغییر بدم و روی کلاینت وقتی اجرا میکنند ابتدا به سرور وصل بشه و اگر ورژن برنامه تغییری نکرده اجرا بشه و در غیر این صورت آخرین ورژن را دریافت و سپس اجرا کنه . برای این کار از چه طریقی عمل کنم و طرح را پیاده کنم ؟ از چه ابزار و روشی ؟
دوستانی که تجربه در این زمینه دارند لطف کنند نظرشون را بفرمایند .
ممنونم
ابوالفضل عباسی
چهارشنبه 29 مهر 1394, 11:14 صبح
با سلام
با استفاده از ftp یک فایل txt رو از کلاینت به سرور بریز(محتویات txt ورژن برنامه هست) و بعد درسرور اون رو بخون اگر ورژن قدیمی بود با ftp یه ورژن جدید براش ارسال کن.
اگر نبود که هیچی
به جای txt میتونی از datasnap هم استفاده کنی برای خوندن ورژن و با ftp ورژن جدید بهش بدی
یوسف زالی
چهارشنبه 29 مهر 1394, 11:28 صبح
سلام.
راه برای این کار زیاده، یکی از راهها اینه که برنامه ای که روی سرور هست، باید ورژن خودش رو جایی ثبت کنه، استفاده از ریسورس خودش توصیه نمی شه. دی بی مکان خوبیه برای این کار.
کلاینت میاد از دی بی آخرین ورژن رو می پرسه، درون خود کلاینت هم ورژن بصورت هارد کد ثبت شده، با اون مقایسه می کنه و بقیه ماجرا.
این که روی سرور چطور ثبت ورژن انجام می شه، هم کاری نداره. کافیه کسی که آخرین آپدیت رو انجام می ده این کار رو کنه تا تمام کلاینت ها در اولین کانکت متوجه بشن.
hamid-nic
چهارشنبه 29 مهر 1394, 11:52 صبح
سلام.
راه برای این کار زیاده، یکی از راهها اینه که برنامه ای که روی سرور هست، باید ورژن خودش رو جایی ثبت کنه، استفاده از ریسورس خودش توصیه نمی شه. دی بی مکان خوبیه برای این کار.
کلاینت میاد از دی بی آخرین ورژن رو می پرسه، درون خود کلاینت هم ورژن بصورت هارد کد ثبت شده، با اون مقایسه می کنه و بقیه ماجرا.
این که روی سرور چطور ثبت ورژن انجام می شه، هم کاری نداره. کافیه کسی که آخرین آپدیت رو انجام می ده این کار رو کنه تا تمام کلاینت ها در اولین کانکت متوجه بشن.
ممنون آقای زالی و آقای عباسی عزیز
خوب فرض کنیم تشخیص سمت کلاینت انجام شد و ورژن جدید موجود بوده حالا با توجه به اینکه از دلفی 7 استفاده میکنم با چه شیوه ای یا ابزاری فایل برنامه را از سرور به کلاینت انتقال بدم ؟ مشکل همزمانی دریافت توسط کلاینت ها را چطوری مدیریت کنم ؟
BORHAN TEC
چهارشنبه 29 مهر 1394, 11:54 صبح
با سلام،
توضیحات در رابطه با روش صحیح این کار زیاده و اگه در حد چند جمله بود همینجا راهنماییتون میکردم. در صورت تمایل پیام خصوصی بدین یا تماس بگیرید.
موفق باشید.
ابوالفضل عباسی
چهارشنبه 29 مهر 1394, 13:13 عصر
خوب فرض کنیم تشخیص سمت کلاینت انجام شد و ورژن جدید موجود بوده حالا با توجه به اینکه از دلفی 7 استفاده میکنم با چه شیوه ای یا ابزاری فایل برنامه را از سرور به کلاینت انتقال بدم ؟ مشکل همزمانی دریافت توسط کلاینت ها را چطوری مدیریت کنم ؟
شما اول همون طوری که ورژن رو یکجا ذخیره میکنید ip کسی که این ورژن رو داره هم همراهش ذخیره کنید بعد برای ارسال ورژن جدید باید ip که ذخیره شده رو به سرور ftp بدی تا به اون ارسال کنه.
وقتی به ip ارسال کنی همزمان ارسال نمیکنه یکی یکی ارسال میکنه و احتمال تداخلش صفر میشه.بعد میتونی توی یک memo مدیریت کنی که الان فایل به کلاینت رسیده یانه در بین راه مشکل براش پیش اومده.
روش send , receive در ftp هم توی تالار دلفی هست و راحت هستش خواستی کارباهاش رو توضیح میدم. یا نه خودت تحقیق کنی.
hamid-nic
چهارشنبه 29 مهر 1394, 13:24 عصر
شما اول همون طوری که ورژن رو یکجا ذخیره میکنید ip کسی که این ورژن رو داره هم همراهش ذخیره کنید بعد برای ارسال ورژن جدید باید ip که ذخیره شده رو به سرور ftp بدی تا به اون ارسال کنه.
وقتی به ip ارسال کنی همزمان ارسال نمیکنه یکی یکی ارسال میکنه و احتمال تداخلش صفر میشه.بعد میتونی توی یک memo مدیریت کنی که الان فایل به کلاینت رسیده یانه در بین راه مشکل براش پیش اومده.
روش send , receive در ftp هم توی تالار دلفی هست و راحت هستش خواستی کارباهاش رو توضیح میدم. یا نه خودت تحقیق کنی.
جناب عباسی عزیز ممنون از توضیحاتتون
ببینید توی سرور همیشه آخرین ورژن هست یا گذاشته میشه پس اون آی پی که میگید میشه آی پی سرور درسته ؟ بعدم سرور ftp منظورتون چیه ؟ یعنی سوای این سرور ؟؟ سرور ftp باید بفرسته به کلاینت ؟ یا کلاینت ها از ftp درخواست کنند ؟ ببخشید من درست متوجه منظورتون نشدم .
در ضمن فقط یک سرور بیشتر نداریم و sql server روی اون اجرا میشه .
ممنون
ابوالفضل عباسی
چهارشنبه 29 مهر 1394, 13:32 عصر
خب این طوری که گفتید یعنی باید کامل توضیح بدم.
به نام خداوند جان و خرد
ببین دوست عزیز شما یک سیستم مثلا سیستم خودت رو به عنوان سرور قرار میدی(یا همون سیستمی که sqlserver روشه) یعنی در برنامه ات از کامپوننت ftpserver استفاده میکنی که قراره ورژن و ip کلاینت هایی که ورژنشون قدیمی هست رو بگیره (مثلا در فایل txt) بعد ورژن و ip رو توی یه متغیر میریزی و چک میکنی ببینی این ورژن قدیمی هست یانه.
حال اگر ورژن قدیمی بود در برنامه ات یه کامپوننت ftp استفاده میکنی با استفاده از اون ورژن جدید که روی سیستمت داری رو براش میفرستی چه جوری؟
به ip میفرستی که کلاینت همراه با ورژنش فرستاد بعد اون در برنامه اش کامپوننت ftp داره این ورژن جدید رو دریافت میکنه.
به همین سادگی .سورس ارسال و دریافت فایل با Ftp توی اینترنت هست میتونی ببینی و ازش الگو بگیری.
hamid-nic
چهارشنبه 29 مهر 1394, 13:40 عصر
خب این طوری که گفتید یعنی باید کامل توضیح بدم.
به نام خداوند جان و خرد
ببین دوست عزیز شما یک سیستم مثلا سیستم خودت رو به عنوان سرور قرار میدی(یا همون سیستمی که sqlserver روشه) یعنی در برنامه ات از کامپوننت ftpserver استفاده میکنی که قراره ورژن و ip کلاینت هایی که ورژنشون قدیمی هست رو بگیره (مثلا در فایل txt) بعد ورژن و ip رو توی یه متغیر میریزی و چک میکنی ببینی این ورژن قدیمی هست یانه.
حال اگر ورژن قدیمی بود در برنامه ات یه کامپوننت ftp استفاده میکنی با استفاده از اون ورژن جدید که روی سیستمت داری رو براش میفرستی چه جوری؟
به ip میفرستی که کلاینت همراه با ورژنش فرستاد بعد اون در برنامه اش کامپوننت ftp داره این ورژن جدید رو دریافت میکنه.
به همین سادگی .سورس ارسال و دریافت فایل با Ftp توی اینترنت هست میتونی ببینی و ازش الگو بگیری.
:لبخند::لبخند::تشویق::تشویق:: شویق:
عجب به نام خدایی نوشتین !! خخخ
خیلی ممنونم میرم روش کار میکنم به مشکل خوردم ازتون کمک میگیرم
این ftpserver از مجموعه indy دیگه درسته ؟
ابوالفضل عباسی
چهارشنبه 29 مهر 1394, 13:46 عصر
بله کل مجموعه ftp از نوع indy هست
یوسف زالی
چهارشنبه 29 مهر 1394, 15:24 عصر
اگر شما دسترسی روی شبکه تون به نحوی هست که می تونید یکی از درایو ها رو مپ کنید، با تابع کپی به راحتی می تونید فایل رو انتقال بدید.
در غیر این صورت با مجموعه ایندی می تونید این کار رو هم انجام بدید.
باید یک سرویس دهنده روی مقصد بنویسید که پورتش روی مقصد باز باشه. برنامه به اون سرویس کانکت شده و چک می کنه ورژنش چیه، روی همون سوکتی که درخواست داده می تونه پاسخش رو بگیره.
راه دیگه اینه که فایل رو در دی بی ذخیره کنید و برنامه فایل رو به فرم یک کوئری از روی دی بی بگیره و استریم فایل ذخیره کنه، نیازی به نوشتن سرویس روی سرور نیست.
باید ببینید که ملزومات کاری که دارید انجام می دید چیه. این ساده ترین راه برای حالتی بود که مپ نمی تونید کنید ولی دی بی رو می بینید.
amir_alaki
چهارشنبه 29 مهر 1394, 18:17 عصر
با سلام
البته دوستان هم اشاره کردند
یه روشی که من چند سال پیش برای حل این مشکل استفاده می کردم این بود که در بانک اطلاعاتی سمت سرور جدولی بود که در اون فایل هایی از برنامه په exe و pbl ها قرار داشتند (Varbinary)و فیلدی که تاریخ و ساعت به روز شدنشون و ورژن فایل ها رو داخلش نگه مداشتم در سمت کلاینت هم یه برنامه کوچک بود که در یک ترد جداگانه قبل از اجرای برنامه اصلی این ورژن ها رو با فایل های سمت کلاینت چک می کرد اگر ورژنی فایلی جدید شده بود اون رو حذف و دباره از بانک اطلاعاتی دریافت می کرد.
من با این روش مشکلی نداشتم و خوب کار میکرد
hamid-nic
چهارشنبه 29 مهر 1394, 20:02 عصر
راه دیگه اینه که فایل رو در دی بی ذخیره کنید و برنامه فایل رو به فرم یک کوئری از روی دی بی بگیره و استریم فایل ذخیره کنه، نیازی به نوشتن سرویس روی سرور نیست.
ممنون آفای زالی عزیز
این روش محدودیت حجم نداره احیانا؟ یعنی اگر فایل exe حجمش بالا باشه برای انتقال به سرور فشار نمیاره ؟
اگر قرار شد به این سبک پیاده کنم باید روی یک دیتابیس جدا این کار را بکنم چون دیتابیس اصلی هر شب بک آپ اتوماتیک داره با این کار حجم بک آپ زیاد میشه .
hamid-nic
چهارشنبه 29 مهر 1394, 20:03 عصر
با سلام
البته دوستان هم اشاره کردند
یه روشی که من چند سال پیش برای حل این مشکل استفاده می کردم این بود که در بانک اطلاعاتی سمت سرور جدولی بود که در اون فایل هایی از برنامه په exe و pbl ها قرار داشتند (Varbinary)و فیلدی که تاریخ و ساعت به روز شدنشون و ورژن فایل ها رو داخلش نگه مداشتم در سمت کلاینت هم یه برنامه کوچک بود که در یک ترد جداگانه قبل از اجرای برنامه اصلی این ورژن ها رو با فایل های سمت کلاینت چک می کرد اگر ورژنی فایلی جدید شده بود اون رو حذف و دباره از بانک اطلاعاتی دریافت می کرد.
من با این روش مشکلی نداشتم و خوب کار میکرد
دوست عزیز حجم فایلتون چه قدر بود ؟
چندتا کلاینت داشتید ؟
به طور متوسط چند وقت به چند وقت آپدیت برنامه داشتین ؟
amir_alaki
چهارشنبه 29 مهر 1394, 20:38 عصر
باسلام
ما تقریبا 40 تا bpl و dll و 8-7 exe داشتیم اگه اشتباه نکنم این جریان مال سال 84
حجم فایل ها هم متغیر بود الان یادم نیست!!
تعداد کلاینت ها مون هم فکر کنم اون موقه 100 همزمان بود، چون انبارهایی و مراکزی در کل ایران داشتیم و حتی بیرون از ایران هم نمایندگی داشتیم که همه با برنامه کار می کردن
بعضی روزها 2-3 بار در روز هم آپدیت داشتیم البته اون موقع کاری کرده بودیم که در صورت آپدیت برنامه و یا ماژول با توجه به حساسیت ماژول ،در سرور به کلیه کاربران آنلاین در برنامه هشدار میدادیم و اونها هم برنامه هاشون رو می بستند و دباره اجرا می کردند.
البته زیر ساخت شبکه خوبی داشتیم همه جا به هم شبکه بودیم و ActiveDirectory برقرار بود بین کلاینت ها و سرور و کل سیستم.
یوسف زالی
چهارشنبه 29 مهر 1394, 23:12 عصر
تفاوتی نمی کنه اگر از اس کیو ال استفاده می کنید یا از خصوصیات برنامه نویسی سوکت. به هر حال باید اون حجم اطلاعات از طریق خط ارتباطی شما منتقل بشه.
این اتفاق مگر چقدر در ماه می افته؟ حجم برنامه ها رو هم می تونید با زیپ کردن یا پکینگ تا یک سوم و بیشتر کاهش بدید.
می تونید پارت پارت بفرستید، و ...
طریقه پیاده سازیش متنوعه، حتی می تونید از فایل استریم استفاده کنید، راه راحت استفاده از فیلد blob مثل varbinary و امثالهم است.
hamid-nic
یک شنبه 03 آبان 1394, 08:15 صبح
تفاوتی نمی کنه اگر از اس کیو ال استفاده می کنید یا از خصوصیات برنامه نویسی سوکت. به هر حال باید اون حجم اطلاعات از طریق خط ارتباطی شما منتقل بشه.
این اتفاق مگر چقدر در ماه می افته؟ حجم برنامه ها رو هم می تونید با زیپ کردن یا پکینگ تا یک سوم و بیشتر کاهش بدید.
می تونید پارت پارت بفرستید، و ...
طریقه پیاده سازیش متنوعه، حتی می تونید از فایل استریم استفاده کنید، راه راحت استفاده از فیلد blob مثل varbinary و امثالهم است.
ممنون آقای زالی عزیز
بله sql استفاده می کنم
از فیلد blob استفاده میکنم ببینم جواب میده یا نه .
یوسف زالی
یک شنبه 03 آبان 1394, 09:50 صبح
blob منظورم نوع خاص نبود، از varbinary استفاده کنید مگر این که در نسخه شما موجود نباشه.
hamid-nic
یک شنبه 03 آبان 1394, 10:30 صبح
blob منظورم نوع خاص نبود، از varbinary استفاده کنید مگر این که در نسخه شما موجود نباشه.
نسخه sql server 2012 است
یوسف زالی
یک شنبه 03 آبان 1394, 10:48 صبح
varbinary استفاده کنید.
Valadi
یک شنبه 03 آبان 1394, 11:52 صبح
با سلام
این لینک (http://www.clevercomponents.com/articles/article011/webupdater.asp) ببین
یادم که یک کامپونتی هم این کار می کرد
gbg
دوشنبه 04 آبان 1394, 09:11 صبح
آقا LMD یه کامپوننت داره اینکار رو میکنه
من ازش استفاده کردم خوبه
ولی بنا به دلایلی بعدها خودم با سوکت نوشتم و پکت بندی کردم
hamid-nic
چهارشنبه 06 آبان 1394, 09:45 صبح
دوستان من برای این کار یک sp درج در بانک نوشتم و یک sp انتخاب کننده که تشریح اون در این تاپیک (http://barnamenevis.org/showthread.php?511020-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-EXE-%D8%AF%D8%B1%D8%AC-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%B3%DA%A9-%D9%85%D8%AD%D9%84%DB%8C) هست
در مورد insert کردن مشکلی نیست ولی در مورد ذخیره اون فایل انتخاب شده در دیسک محلی مشکل دارم در واقع همون کار با stream هاست که متاسفانه به جواب نرسیدم ممنون میشم اگر دوستان راهنمایی کنند شرح مشکل را در همین لینک تاپیک بالا که گذاشتم هست
amir_alaki
چهارشنبه 06 آبان 1394, 11:14 صبح
باسلام
این کد فکر کنم مشکلتون رو حل کنه البته این برای عکس و فایل pdf مثال زده ولی خوب فرقی با مورد شما نداره
فقط باید یکم ریزه کاری بهش اضافه کنید
ورژن قبلی فایل روی کلاینت رو بدست بیارید و یا از تاریخ ساخته شدنش روی کلاینت (اگه وجود داره روی کلاینت) و فایل جدید رو بازیابی کنید
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')).SaveT oStream(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;
hamid-nic
چهارشنبه 06 آبان 1394, 11:19 صبح
ممنونم بررسی می کنم اطلاعش را می دهم
ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 11:25 صبح
دوست عزیز این کد شما خیلی خیلی جامع هست.
به نظرم یکم باید سبکتر میگذاشتی تا دوست عزیزمون و دیگران راحتتر درک کنن
hamid-nic
چهارشنبه 06 آبان 1394, 11:33 صبح
این کد میاد بایت اول اون فایل را میخونه و تشخیص میده که از چه نوعی بوده من اون قسمت هاش را جدا کردم از کد و فقط قسمت اصلی را بکار بردم و انجام دادم اما فایل exe ای که میسازه حجمش 1 بایته :گریه:
نمی دونم کجای کار مشکل داره :متفکر:
یعنی درست در جدول insert نشده ؟
amir_alaki
چهارشنبه 06 آبان 1394, 11:48 صبح
با سلام
دوست عزیز این کد شما خیلی خیلی جامع هست.
به نظرم یکم باید سبکتر میگذاشتی تا دوست عزیزمون و دیگران راحتتر درک کنن
حق با شماست، متشکر اشاره کردین
در مورد ذخیره شدن 1 بایت شما MStream.Size رو قبل از سیو نگاه کنین ببینین چقدره؟
چون کد خیلی کاری با مقادیر قایل نمی کنه فقط برای فهمیدن نوع فایل از هدر 4 بایت رو می خونه و بعد سیو میکنه
با تشکر
ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 12:18 عصر
روش خوبی برای ارسال ورژن جدید به کلاینت ها هست اما
اگر توی این موقعی که داره خواندن بانک انجام میشه تا تبدیل به exe کنه یک بایت در بانک دچار فروریزش اطلاعاتی بشه ممکنه exe کارنکنه و کلاینت به مشکل بربخوره.
بنظرم باید فایل یک جا با روش ftp یا datasnap ارسال بشه که یا فایل کلا نیاد و یا کامل بیاد.
من خودم وقتی یه فایل رو میخوام از ویندوز به موبایلم بفرستم.با روش ftp که روی هر دو نوشته ام فایل رو انتقال میدم بدون هیچ دردسری(مثل زاپیا و shareIt ،چون با وای فای میفرستم سرعتش هم خوبه)
اما اینکه در بانکه ممکنه حجم متنی توی بانک زیاد باشه و سیستم درگیر خواندن بشه و زمان زیادی ببره:اشتباه:
hamid-nic
چهارشنبه 06 آبان 1394, 12:26 عصر
روش خوبی برای ارسال ورژن جدید به کلاینت ها هست اما
اگر توی این موقعی که داره خواندن بانک انجام میشه تا تبدیل به exe کنه یک بایت در بانک دچار فروریزش اطلاعاتی بشه ممکنه exe کارنکنه و کلاینت به مشکل بربخوره.
بنظرم باید فایل یک جا با روش ftp یا datasnap ارسال بشه که یا فایل کلا نیاد و یا کامل بیاد.
من خودم وقتی یه فایل رو میخوام از ویندوز به موبایلم بفرستم.با روش ftp که روی هر دو نوشته ام فایل رو انتقال میدم بدون هیچ دردسری(مثل زاپیا و shareIt ،چون با وای فای میفرستم سرعتش هم خوبه)
اما اینکه در بانکه ممکنه حجم متنی توی بانک زیاد باشه و سیستم درگیر خواندن بشه و زمان زیادی ببره:اشتباه:
درسته حق باشماست من اومدم راحت ترین کار را انتخاب کردم
نمونه برنامه یا سورسی در مورد مطالبی که گفتید دارین که بتونم ازش ایده بگیرم ؟
ابوالفضل عباسی
چهارشنبه 06 آبان 1394, 12:36 عصر
برای ftp توی اینترنت فراوان یافت میشه اما این کامله:
indy-FTP (http://barnamenevis.org/attachment.php?attachmentid=135283&d=1442465402)
hamid-nic
چهارشنبه 06 آبان 1394, 12:47 عصر
با سلام
حق با شماست، متشکر اشاره کردین
در مورد ذخیره شدن 1 بایت شما MStream.Size رو قبل از سیو نگاه کنین ببینین چقدره؟
چون کد خیلی کاری با مقادیر قایل نمی کنه فقط برای فهمیدن نوع فایل از هدر 4 بایت رو می خونه و بعد سیو میکنه
با تشکر
همون یک بایت را نشون میده .
amir_alaki
چهارشنبه 06 آبان 1394, 12:54 عصر
باسلام
فکر کنم بشه این مشکل رو حل کرد به اینصورت که فایل اگه کوچیکه که خیلی مشکل نداره دباره از سرور دانلودش کنین، اگه بزرگه بشکنینش و هر تیکه رو ارسال کنبن و در هر ارسال برای بررسی درستی فایل ارسالی روش های Error detection مانند ParityBit یا checkSum رو برای اون تیکه استفاده کنین و فایل رو سرهم کنین.
برای ارسال و دریافت اطلاعات معمولا چون کانال های ارتباطی (شبکه) ممکنه نویز دار باشن(مثل همین موردی که دوستمون گفتن فروریزش اطلاعات) از روش هایی که در نظریه اطلاعات هست و مربوط به انتقال اطلاعات در انواع کانال ها با نویر های متفاوت (محدود) وجود داره استفاده می کنن، فرض کنید اطلاعات یک فرستنده در یک ماهواره رو می خواید دریافت کنین اون موقع اگه اشتباه مخابره بشه و یا همراه با نویز باشه که فاتحه کار خوندس، ولی با روش هایی میشه تاحدودی برای این مشکل چاری ایی اندیشید.
در مورد Ftp به سوال برام پیش اومد امنیت سرور رو پایین نمیاره؟و فکر کنم در فایل هایی با حجم بالا هم دچاره مشکل بشه
البته این نطر منه
تشکر
amir_alaki
چهارشنبه 06 آبان 1394, 12:58 عصر
همون یک بایت را نشون میده .
فیلد بانک اطلاعاتی از چه نوعی هست؟
با تابع
DATALENGTH([_File])
در SQl اندازه رو چک کن ببین چقدر ذخیره شده.
hamid-nic
چهارشنبه 06 آبان 1394, 13:07 عصر
فیلد بانک اطلاعاتی از چه نوعی هست؟
با تابع
DATALENGTH([_File])
در SQl اندازه رو چک کن ببین چقدر ذخیره شده.
بله چک کردم متاسفانه همون 1 بایته
این نشون میده درست insert نشده . اما روش من کجاش مشکل داره ؟؟؟:متفکر:
amir_alaki
چهارشنبه 06 آبان 1394, 14:21 عصر
با سلام
كد ثبت كه نوشتين چيه؟
hamid-nic
چهارشنبه 06 آبان 1394, 15:40 عصر
با سلام
كد ثبت كه نوشتين چيه؟
بله مشکل از sp که عملیات insert را انجام می داد بود که این sp را اینجا میزارم برای همه ی کسانی که یه روزی به این مشکل برمی خورند و به این تاپیک می رسند البته این sp از نوع update می باشد به هر شکلی که دوست داشته باشید تغییرش دهید :
این sp بدون هیچ مشکلی کار میکنه و فیلد varbinary را در دیتابیس ذخیره می کنه .
ALTER PROCEDURE [dbo].[sp_LastExe_Update]
@CodeExe tinyint,
@NameFile nvarchar(254) = NULL,
@VersionFile int = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL varbinary(max)
DECLARE @str nvarchar(400)
SET @str = N'SELECT @SQL = CAST( bulkcolumn AS VARBINARY(max) ) FROM '
SET @str =@str+ N' OPENROWSET( BULK '''
SET @str =@str+ @NameFile
SET @str =@str+ N''', SINGLE_BLOB ) AS x'
EXEC sp_executeSQL @str, N'@SQL varbinary(max) OUT', @SQL OUTPUT;
Update LastExe
Set
[namefile]=@NameFile,
[sizefile]=DATALENGTH(@SQL),
[VersionFile]=@VersionFile,
[datecreate]=getdate(),
[ExeFile]=@SQL
where
CodeExe=@CodeExe
END
amir_alaki
چهارشنبه 06 آبان 1394, 15:59 عصر
بسيار عالي،اينكه به اين صورت فايل رو در جدول ذخيره ميكنين احتمال حمله به سرورتون رو زياد ميكنه،هر كسي كه بخواهد شيطوني بكنه ميشه و با اين sp ميتونه.
فكر كنم اگه داخل برنامه تبديل بشه و فقط محتويات فايل به sp ارسال بشه بهتره تا آدرس فايل،اينجوري خودت ميتوني براي محكم كاري يه تغيرم در اطلاعات فايل بدي مثلا كدش كني و يا هر كار ديگه و موقع بازيابي فايل عكس اين عمليات رو انجام بدي، يعني طوري كه اين فايل هاي ذخيره شده در بانك فقط با برنامه خودت از سرور گرفته بشن، براي كلاينت هايي كه مجاز هستند.
البته اين فقط نظر منه
موفق باشي
hamid-nic
چهارشنبه 06 آبان 1394, 16:11 عصر
بسيار عالي،اينكه به اين صورت فايل رو در جدول ذخيره ميكنين احتمال حمله به سرورتون رو زياد ميكنه،هر كسي كه بخواهد شيطوني بكنه ميشه و با اين sp ميتونه.
فكر كنم اگه داخل برنامه تبديل بشه و فقط محتويات فايل به sp ارسال بشه بهتره تا آدرس فايل،اينجوري خودت ميتوني براي محكم كاري يه تغيرم در اطلاعات فايل بدي مثلا كدش كني و يا هر كار ديگه و موقع بازيابي فايل عكس اين عمليات رو انجام بدي، يعني طوري كه اين فايل هاي ذخيره شده در بانك فقط با برنامه خودت از سرور گرفته بشن، براي كلاينت هايي كه مجاز هستند.
البته اين فقط نظر منه
موفق باشي
بله ممنون از راهنمایی هاتون . البته دیتابیسی که برنامه را نگه میداره از دیتابیس اصلی جداست . هیچ کسی هم تحت هیچ شرایطی به سرور دسترسی نداره و صد البته شرایط خاص دیگه ای هم هست که دیگه اینجا نیاوردم اون کد بالا بصورت خام نوشته شده و اصل کار را بیان کردم برای کسی که مثل من به مشکل بربخوره و کارش راه بیفته . :چشمک:
برای این کار بهتر از این روش هم هست ولی من با توجه به شرایط پروژه این روش را انتخاب کردم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.