Himalaya
دوشنبه 30 خرداد 1390, 16:15 عصر
سلام. این کامپوننت برای مدیریت فایلها و فولدرها نوشته شده و دارای محیطی به شکل زیره
خصوصیاتش هم شامل موارد زیر هستش
1. پرش به فولدر Root
2. پرش به فولدر Parent
3. رفرش فولدر جاری
4. حذف فایلها و فولدرها
5. افزودن فولدر به شاخه جاری
6. آپلود فایل
7. Zip کردن فایلهای انتخابی و یا فولدر جاری
8. Extract کردن فایلهای Zip در فولدر جاری
9. دانلود فایلهای Zip موجود بر روی هاست
10. تغییر نام فایل انتخابی یا فولدر جاری
11. صفحه بندی فایلها و فولدرها در سمت کلاینت
12. نمایش نام و سایز فایل و زمان ایجاد اون
13. نمایش یا عدم نمایش مسیر فولدر جاری
14. محدود کردن نوع فایلهای قابل آپلود توسط کاربر
15. محدود کردن نوع فایلهای قابل رویت توسط کاربر
16. محدود کردن سایز فایلهای قابل آپلود
17. عدم دسترسی کاربر به مسیرهای بالاتر از مسیر Root
18. اجازه یا عدم اجازه جایگزینی فایلهای هم نام در زمان Unzip یا Upload
19. قابلیت حذف هر یک از دکمه های تعریف شده
20. قابلیت Copy و Paste فولدر جاری یا فایلهای انتخابی
21. قابلیت Sort فایلها به صورت نزولی یا صعودی توسط هر یک از ستونهای نام، سایز و زمان ایجاد فایل
22. مشاهده تصاویر با قرار گرفتن موس بر روی فایل عکس با حفظ تناسب عرض و ارتفاع
23. مشاهده خطاها و هشدارها و دریافت مقادیر ورودی (مثل نام فولدر جدید یا فایل زیپ) در پنجره ای به فرم زیر (مثلا بعد از انتخاب فایل و کلیک بر روی دکمه حذف)
24. دارای دیزاین در محیط vs با قابلیت مشاهده تغییرات به صورت ران تایم در vs
25. قابلیت رجیستر کردن Handler مربوط به FileUploader در فایل web.config توسط پنجره Tasks در محیط دیزاین
تمام اعمال توسط Ajax و بدون رفرش صفحه انجام میشه (منظور از Ajax استفاده از UpdatePanel و AjaxControlToolkit و این جور ابزارها نیست (چون استفاده از این ابزارها فقط به درد سمبل کردن کار میخوره، ولا غیر)(
منظور استفاده از روش client callback هستش که آقای راد تو یه تاپیک این روش رو توضیح دادن. البته نه دقیقا به اون صورت. چون واسه رجیستر کردن فایل جاوا اسکریپتی که عملیات ارسال و دریافت داده رو بین کلاینت و سرور انجام میده تو صفحه، باید تو CodeBehind یه سری کد نوشته میشد که اول از این روش استفاده کردم، ولی مشکلی که وجود داشت این بود که تو یکی از ورژنهای Opera (دقیقا یادم نیست کدوم) تابع WebForm_InitCallback که باید به انتهای سورس اضافه میشد، تو این ورژن اضافه نمیشد و باعث ایجاد مشکل میشد (احتمالا تو یه سری دیگه از مرورگرها هم به همین صورت باشه (شایدم من اشتباه کردم)). به هر حال تصمیم گرفتم که کدای جاوای مورد نظر رو به صورت یه فایل مجزا تو صفحه رجیستر کنم و بخشهایی از اون رو هم که نیازی بهش نبود رو حذف کردم و برای جلوگیری از تداخل احتمالی، اسم متغیرها و توابع داخل اون رو تغییر دادم و بخشهایی رو هم به اون اضافه کردم. در نهایی فایل جاوایی که 21kb بود به 7kb تبدیل شد، بدون اینکه خللی تو کارش ایجاد بشه و دیگه واسه رجیستر کردنش تو صفحه، احتیاجی به نوشتن کد تو codebehind نبود و با یک خط کد سمت کلاینت، درخواست واسه سرور ارسال میشد.
برای ارسال و دریافت داده ها، سمت کلاینت از فرمت json و سمت سرور از کلاس Dictionary به همراه کلاس JavaScriptSerializer استفاده شده
چندتا نکته:
1. این کامپوننت با مرورگرهای زیر تست شده
IE 7,8 و FireFox 3.5,4 و Opera 10,11.1 و Netscape 9 و Chrome 3.0.182.3 و Safari 4
2. برای آپلود فایل بدون PostBack از روشی که تو لینک زیر گفته شده استفاده کردم. البته مجبور شدم یه قسمتهایی از فایل JavaScript اونو دستکاری کنم. تو این روش فقط از یه فایل جاوا اسکریپت 25kb جهت آپلود استفاده میشه. طرز کارش هم اضافه کردن یه Iframe به انتهای صفحه هستش که فایل رو از طریق یه تگ Form که اون رو هم به آخر صفحه اضافه میکنه برای Iframe ارسال میکنه و از اونجا فایل برای سرور ارسال میشه
http://valums.com/ajax-upload
3. اگه فایلی که میخواید آپلود کنید بیشتر از 4mg بود باید تو فایل web.config و تو زیر شاخه system.web از تگ
</ ""=httpRuntime maxRequestLength="" executionTimeout>
با مقادیر مورد نظر استفاده کنید. در مورد FileUpload خود .net هم به همین صورته. واسه اطلاعات بیشتر به msdn یا گوگل مراجعه کنید
4. با کلیک بر روی فایلها میشه 1 یا چند فایل رو تو حالت انتخاب قرار داد و اقدام به حذف و یا فشرده کردن اونا کرد. در صورت انتخاب نشدن فایل، برنامه عملیات مورد نظر و بر روی فولدر جاری انجام میده.
5. اگه مثلا کاربر تو فولدر d از مسیر a>b>c>d قرار داشته باشه، به فرض اینکه Root مشخص شده برای کاربر، فولدر b باشه، با زدن گزینه اول (آیکن خونه) به فولدر b منتقل میشه. کاربر به فولدر های بالاتر از اون دسترسی نخواهد داشت
6. برای Zip و UnZip کردن فایلها و فولدر ها اول خواستم از کتابخونه های خود .net استفاده کنم
و سراغ dll هایی که واسه این کار نوشته شده نرم. واسه همین رفتم سراغ فضای نامی
System.IO.Packaging. هر دو عملیات به خوبی انجام شد ولی یه مشکلی داشت. اونم اینکه وقتی با این روش فایلها رو زیپ میکردم یه فایل Xml هم به لیست فایلهای زیپ شده اضافه میشد و پسوند فایلهای موجود تو اون قرار میگرفت و موقع unzip کردن با همین روش این فایل بررسی میشد و پسوندهایی که تو اون قرار گرفتن Extract میشدن. مشکل وقتی پیش میومد که میخواستیم با یه برنامه دیگه فایلها رو زیپ کنیم و رو هاست Extract کنیم. چون فایل xml تو اون آرشیو نبود پس فایلی هم Extract نمیشد. از System.IO.Compression هم نمیشد استفاده کرد، چون نمیشه باهاش با فایلهای زیپ عادی کار کرد (file.gz). پس اجبارا از Ionic.dll (DotNetZip) استفاده کردم که واسه کار با فایلهای زیپ نوشته شده. پس این dll 400 کیلوبایتی هم باید تو پوشه bin قرار بگیره.
7. پراپرتی های این کامپوننت به صورته زیره
واسه گزینه AccessFileType و UploadFileType اگه از .* استفاده بشه یعنی هر نوع فایلی. ولی اگه خواستید نوع فایلها رو فیلتر کنید، پراپرتی مورد نظر رو به صورت مثلا jpg,zip,rar ست کنید
در مورد گزینه AddJqueryMin: اگه این گزینه برابر true باشه فایل jquery-1.4.1.min
که تو ریسورس قرار گرفته به صفحه اضافه میشه. اگه خواستید از ورژن دیگه ای استفاده کنید، این گزینه رو روی False قرار بدید و کتابخونه jquery مورد نظرتون رو تو قسمت Head اضافه کنید
8. آپلود فایل تو این کامپوننت توسط Handler انجام میشه. پس واسه استفاده از این قابلیت باید این Handler تو فایل web.config رجیستر بشه. واسه رجیستر کردن یا تو میحط دیزاین از پنجره Tasks کنار کنترل استفاده کنید (که به صورت خودکار تگهای مورد نظر رو به فایل web.config اضافه میکنه، یا اگه خواستید دستی اقدام به رجیستر کردن کنید، به صورت زیر عمل کنید
IIS6 زیر شاخه system.web قسمت httpHandlers بعد از تگ remove
< /"add verb="*" path="FileUploader.aspx" type="AjaxFileManager.FileUploader>
IIS7 زیر شاخه system.webServerقسمت handlers بعد از آخرین تگ remove
add name="FileUploader" verb="*" path="FileUploader.aspx" preCondition="integratedMode" type="AjaxFileManager.FileUploader"
خصوصیاتش هم شامل موارد زیر هستش
1. پرش به فولدر Root
2. پرش به فولدر Parent
3. رفرش فولدر جاری
4. حذف فایلها و فولدرها
5. افزودن فولدر به شاخه جاری
6. آپلود فایل
7. Zip کردن فایلهای انتخابی و یا فولدر جاری
8. Extract کردن فایلهای Zip در فولدر جاری
9. دانلود فایلهای Zip موجود بر روی هاست
10. تغییر نام فایل انتخابی یا فولدر جاری
11. صفحه بندی فایلها و فولدرها در سمت کلاینت
12. نمایش نام و سایز فایل و زمان ایجاد اون
13. نمایش یا عدم نمایش مسیر فولدر جاری
14. محدود کردن نوع فایلهای قابل آپلود توسط کاربر
15. محدود کردن نوع فایلهای قابل رویت توسط کاربر
16. محدود کردن سایز فایلهای قابل آپلود
17. عدم دسترسی کاربر به مسیرهای بالاتر از مسیر Root
18. اجازه یا عدم اجازه جایگزینی فایلهای هم نام در زمان Unzip یا Upload
19. قابلیت حذف هر یک از دکمه های تعریف شده
20. قابلیت Copy و Paste فولدر جاری یا فایلهای انتخابی
21. قابلیت Sort فایلها به صورت نزولی یا صعودی توسط هر یک از ستونهای نام، سایز و زمان ایجاد فایل
22. مشاهده تصاویر با قرار گرفتن موس بر روی فایل عکس با حفظ تناسب عرض و ارتفاع
23. مشاهده خطاها و هشدارها و دریافت مقادیر ورودی (مثل نام فولدر جدید یا فایل زیپ) در پنجره ای به فرم زیر (مثلا بعد از انتخاب فایل و کلیک بر روی دکمه حذف)
24. دارای دیزاین در محیط vs با قابلیت مشاهده تغییرات به صورت ران تایم در vs
25. قابلیت رجیستر کردن Handler مربوط به FileUploader در فایل web.config توسط پنجره Tasks در محیط دیزاین
تمام اعمال توسط Ajax و بدون رفرش صفحه انجام میشه (منظور از Ajax استفاده از UpdatePanel و AjaxControlToolkit و این جور ابزارها نیست (چون استفاده از این ابزارها فقط به درد سمبل کردن کار میخوره، ولا غیر)(
منظور استفاده از روش client callback هستش که آقای راد تو یه تاپیک این روش رو توضیح دادن. البته نه دقیقا به اون صورت. چون واسه رجیستر کردن فایل جاوا اسکریپتی که عملیات ارسال و دریافت داده رو بین کلاینت و سرور انجام میده تو صفحه، باید تو CodeBehind یه سری کد نوشته میشد که اول از این روش استفاده کردم، ولی مشکلی که وجود داشت این بود که تو یکی از ورژنهای Opera (دقیقا یادم نیست کدوم) تابع WebForm_InitCallback که باید به انتهای سورس اضافه میشد، تو این ورژن اضافه نمیشد و باعث ایجاد مشکل میشد (احتمالا تو یه سری دیگه از مرورگرها هم به همین صورت باشه (شایدم من اشتباه کردم)). به هر حال تصمیم گرفتم که کدای جاوای مورد نظر رو به صورت یه فایل مجزا تو صفحه رجیستر کنم و بخشهایی از اون رو هم که نیازی بهش نبود رو حذف کردم و برای جلوگیری از تداخل احتمالی، اسم متغیرها و توابع داخل اون رو تغییر دادم و بخشهایی رو هم به اون اضافه کردم. در نهایی فایل جاوایی که 21kb بود به 7kb تبدیل شد، بدون اینکه خللی تو کارش ایجاد بشه و دیگه واسه رجیستر کردنش تو صفحه، احتیاجی به نوشتن کد تو codebehind نبود و با یک خط کد سمت کلاینت، درخواست واسه سرور ارسال میشد.
برای ارسال و دریافت داده ها، سمت کلاینت از فرمت json و سمت سرور از کلاس Dictionary به همراه کلاس JavaScriptSerializer استفاده شده
چندتا نکته:
1. این کامپوننت با مرورگرهای زیر تست شده
IE 7,8 و FireFox 3.5,4 و Opera 10,11.1 و Netscape 9 و Chrome 3.0.182.3 و Safari 4
2. برای آپلود فایل بدون PostBack از روشی که تو لینک زیر گفته شده استفاده کردم. البته مجبور شدم یه قسمتهایی از فایل JavaScript اونو دستکاری کنم. تو این روش فقط از یه فایل جاوا اسکریپت 25kb جهت آپلود استفاده میشه. طرز کارش هم اضافه کردن یه Iframe به انتهای صفحه هستش که فایل رو از طریق یه تگ Form که اون رو هم به آخر صفحه اضافه میکنه برای Iframe ارسال میکنه و از اونجا فایل برای سرور ارسال میشه
http://valums.com/ajax-upload
3. اگه فایلی که میخواید آپلود کنید بیشتر از 4mg بود باید تو فایل web.config و تو زیر شاخه system.web از تگ
</ ""=httpRuntime maxRequestLength="" executionTimeout>
با مقادیر مورد نظر استفاده کنید. در مورد FileUpload خود .net هم به همین صورته. واسه اطلاعات بیشتر به msdn یا گوگل مراجعه کنید
4. با کلیک بر روی فایلها میشه 1 یا چند فایل رو تو حالت انتخاب قرار داد و اقدام به حذف و یا فشرده کردن اونا کرد. در صورت انتخاب نشدن فایل، برنامه عملیات مورد نظر و بر روی فولدر جاری انجام میده.
5. اگه مثلا کاربر تو فولدر d از مسیر a>b>c>d قرار داشته باشه، به فرض اینکه Root مشخص شده برای کاربر، فولدر b باشه، با زدن گزینه اول (آیکن خونه) به فولدر b منتقل میشه. کاربر به فولدر های بالاتر از اون دسترسی نخواهد داشت
6. برای Zip و UnZip کردن فایلها و فولدر ها اول خواستم از کتابخونه های خود .net استفاده کنم
و سراغ dll هایی که واسه این کار نوشته شده نرم. واسه همین رفتم سراغ فضای نامی
System.IO.Packaging. هر دو عملیات به خوبی انجام شد ولی یه مشکلی داشت. اونم اینکه وقتی با این روش فایلها رو زیپ میکردم یه فایل Xml هم به لیست فایلهای زیپ شده اضافه میشد و پسوند فایلهای موجود تو اون قرار میگرفت و موقع unzip کردن با همین روش این فایل بررسی میشد و پسوندهایی که تو اون قرار گرفتن Extract میشدن. مشکل وقتی پیش میومد که میخواستیم با یه برنامه دیگه فایلها رو زیپ کنیم و رو هاست Extract کنیم. چون فایل xml تو اون آرشیو نبود پس فایلی هم Extract نمیشد. از System.IO.Compression هم نمیشد استفاده کرد، چون نمیشه باهاش با فایلهای زیپ عادی کار کرد (file.gz). پس اجبارا از Ionic.dll (DotNetZip) استفاده کردم که واسه کار با فایلهای زیپ نوشته شده. پس این dll 400 کیلوبایتی هم باید تو پوشه bin قرار بگیره.
7. پراپرتی های این کامپوننت به صورته زیره
واسه گزینه AccessFileType و UploadFileType اگه از .* استفاده بشه یعنی هر نوع فایلی. ولی اگه خواستید نوع فایلها رو فیلتر کنید، پراپرتی مورد نظر رو به صورت مثلا jpg,zip,rar ست کنید
در مورد گزینه AddJqueryMin: اگه این گزینه برابر true باشه فایل jquery-1.4.1.min
که تو ریسورس قرار گرفته به صفحه اضافه میشه. اگه خواستید از ورژن دیگه ای استفاده کنید، این گزینه رو روی False قرار بدید و کتابخونه jquery مورد نظرتون رو تو قسمت Head اضافه کنید
8. آپلود فایل تو این کامپوننت توسط Handler انجام میشه. پس واسه استفاده از این قابلیت باید این Handler تو فایل web.config رجیستر بشه. واسه رجیستر کردن یا تو میحط دیزاین از پنجره Tasks کنار کنترل استفاده کنید (که به صورت خودکار تگهای مورد نظر رو به فایل web.config اضافه میکنه، یا اگه خواستید دستی اقدام به رجیستر کردن کنید، به صورت زیر عمل کنید
IIS6 زیر شاخه system.web قسمت httpHandlers بعد از تگ remove
< /"add verb="*" path="FileUploader.aspx" type="AjaxFileManager.FileUploader>
IIS7 زیر شاخه system.webServerقسمت handlers بعد از آخرین تگ remove
add name="FileUploader" verb="*" path="FileUploader.aspx" preCondition="integratedMode" type="AjaxFileManager.FileUploader"