PDA

View Full Version : سوال: فیلتر کردن fileuplod



aliimanypoor
یک شنبه 01 بهمن 1391, 23:03 عصر
سلام
چه جوری میشه انواع فایلی را که قراره fileuplod اجازه بده تا باز بشه را مشخص کرد
یا فایل هایی که نمایش میده را مثلا لیستی مثل سایر جاها در قسمت نوع فایل بیاد و نوع jpg را انتخاب کنیم و وفقط آنها نمایش داده شوند.:متفکر:

morteza_mokhtari
یک شنبه 01 بهمن 1391, 23:10 عصر
public static bool IsValidFileType(string FileName)
{
string[] AcceptedFileTypes = new string[] { "jpg", "gif", "jpeg","png" };
string ext = FileName.Substring(FileName.LastIndexOf(".") + 1, FileName.Length - FileName.LastIndexOf(".") - 1);
for (int i = 0; i < AcceptedFileTypes.Length; i++)
{

if (ext == AcceptedFileTypes[i])
{
return true;
}
}
return false;
}

AsyncFileUpload afu = (AsyncFileUpload)sender;
if (IsValidFileType(afu.FileName))
{
کدهای مورد نظر برای آپلود
}

masoud60
دوشنبه 02 بهمن 1391, 00:00 صبح
شما لیستی که باز میشه رو نمیتونید محدود کنید(asp.net) با روشی که آقای مختاری گفتند یا به روش زیر می تونید صحت فایل دریافتی رو چک کنید
if (FileUpload1.PostedFile.ContentType == "application/vnd.ms-excel")
این کد برای دریافت .xls هست


------------------------------------
http://www.kohan-co.net

fakhravari
دوشنبه 02 بهمن 1391, 00:15 صبح
بررسی string[] AcceptedFileTypes بهتر از ContentType

na3er-faraji
دوشنبه 02 بهمن 1391, 03:38 صبح
اون روشی که دوستمون اومده پسوندها رو چک کرده به سادگی دور زده میشه. یعنی کاربر کافیه بیاد پسوند فایل رو عوض کنه. بهتره از روش ContentType استفاده کنید. همچنین برای چک کردن در سمت کلاینت میتوانید از روشی که در مقاله زیر توضیح داده شده استفاده کنید. اما همان طور که در مقاله توضیح داده شده در صورتی که کاربر جاوااسکریپت رو غیر فعال کنه این روش کار نمیکنه. پس بهتره هم در سمت کلاینت و هم در سمت سرور اعتبار سنجی رو انجام بدید
http://www.dotnettips.info/post/973/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%B3%D8%A7%DB%8C%D8%B2-%D9%88-%D9%BE%D8%B3%D9%88%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D8%B4%D8%AF%D9%87-%D9%82%D8%A8%D9%84-%D8%A7%D8%B2-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1
موفق باشید.

aliimanypoor
جمعه 06 بهمن 1391, 18:44 عصر
با تشکر از دوستان که راهنمایی کردند
منتها می دونستم میشه در برنامه نویسی راهی برای کنترل و چک کردن فایل آپلود شده داشت لذا تصور می کردم حتما خاصیت یا تنظیمی برای محدود کردن انتخاب ها وجود دارد و نمی دانم و با توضیحات دوستان معلوم شد چنین تنظیمی پیش بینی نشده است
در تعجبم از میکروسافت (بیل گیتز) که برای این موارد فکری نکرده اند واقعا به این میرسم که استیو جابز حرفاش راست بوده و علاقه مندم بدونم در php هم این مشکلات خنده دار هست

morteza_mokhtari
جمعه 06 بهمن 1391, 22:29 عصر
سلام دوست عزیز فکر کنم شما دارید زود قضاوت میکنید برای چک کردن نوع فایل در سمت کلاینت میشه از RegularExpressionValidator استفاده کرد به این صورت


<asp:RegularExpressionValidator ValidationGroup="1458" id="UpLoadValidator" runat="server" ErrorMessage="لطفا برای آپلود یک تصویر انتخاب کنید" ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.png|.bmp|.jpeg|.gif)$" ControlToValidate="FileUpload1" Text="*"> </asp:RegularExpressionValidator>


در ضمن اگه قرار بود برای هرچیزی که برنامه نویس نیاز داشت یه خاصیت تنظیم میکردن که باید کلی چیز دیگه اضافه میشد که این به نظر من منطقی نیست این هم کد سمت سرور



private bool IsFileValid()
{

string[] allowedImageTyps = { "image/gif", "image/pjpeg", "image/bmp", "image/x-png" };

StringCollection imageTypes = new StringCollection();

imageTypes.AddRange(allowedImageTyps);

if (imageTypes.Contains(FileUpload1.PostedFile.Conten tType))

return true;

else
{

return false;

}

}

در ضمن name space System.Collections.Specialized; به بالای صفحه اضافه کنید.

fakhravari
جمعه 06 بهمن 1391, 23:33 عصر
ContentType هم قابل دور زدن.
بررسی نام فایل بهتر

اوبالیت به بو
شنبه 07 بهمن 1391, 14:30 عصر
ContentType هم قابل دور زدن.
بررسی نام فایل بهتر

ContentType چطور قابل دور زدنه؟

mRizvandi
شنبه 07 بهمن 1391, 15:58 عصر
ContentType چطور قابل دور زدنه؟

تا اونجایی که من می دونم روش ContentType هم داره بر اساس پسوند فایلها کار می کنه، یه فایل pdf رو پسوندش رو به jpg تغییر بدین و ببینید که باز هم ContentType داره درست جواب میده؟ (البته که نه)




در تعجبم از میکروسافت (بیل گیتز) که برای این موارد فکری نکرده اند واقعا به
این میرسم که استیو جابز حرفاش راست بوده و علاقه مندم بدونم در php هم این مشکلات
خنده دار هست

دوست عزیز محدودیتهای وب هیچ ربطی به مایکروسافت و بیل گیتز و توانایی های مرحوم استیو جابز نداره!
وب تکنولوژی بسیار قدیمی است که در سمت کلاینت بسیار ضعیفه، در سمت سرور ابزارهای بسیار قدرتمندی وجود داره، اما در هر صورت HTML همچنان ضعیفه. البته در HTML5 خیلی قابلیت به وب اضافه شده.

na3er-faraji
شنبه 07 بهمن 1391, 16:04 عصر
تا اونجایی که من می دونم روش ContentType هم داره بر اساس پسوند فایلها کار می کنه، یه فایل pdf رو پسوندش رو به jpg تغییر بدین و ببینید که باز هم ContentType داره درست جواب میده؟ (البته که نه)
خیر. شما اشتباه فکر میکنید. ContentType براساس هدر فایل کار میکند. 4 بایت و در بعضی از فایل ها 8 بایت اول به عنوان هدر فایل در نظرگرفته میشه. وقتی از ContentType استفاده می کنیم در واقع داریم هدر رو چک میکنیم. اگر کسی هدر فایل رو دستکاری کنه در واقع فایل رو خراب کرد و دیگه قابل دسترسی نیست. مگه اینکه بیاد هدر رو تغییر بده . مثلا exe رو بکنه jpg و بعد بیاد تو سرور هدر رو دوباره تغییر بده تا بتونه از فایل exeش استفاده کنه که صددرصد این کار شدنی نیست !
مثلا کد زیر رو ببینید. این کد داره هدر فایل ها رو چک میکنه. اما روش ContentType هم در واقع در پشت صحنه داره همین کار رو میکنه!

public static bool CheckHeaderImage(string extention, byte[] headerFile)
{
Dictionary<string, byte[]> imageHeader = new Dictionary<string, byte[]>();
imageHeader.Add(".JPG", new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 });
imageHeader.Add(".JPEG", new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 });
imageHeader.Add(".PNG", new byte[] { 0x89, 0x50, 0x4E, 0x47 });
imageHeader.Add(".TIF", new byte[] { 0x49, 0x49, 0x2A, 0x00 });
imageHeader.Add(".TIFF", new byte[] { 0x49, 0x49, 0x2A, 0x00 });
imageHeader.Add(".GIF", new byte[] { 0x47, 0x49, 0x46, 0x38 });
imageHeader.Add(".BMP", new byte[] { 0x42, 0x4D });

byte[] headerPicture = imageHeader[extention.ToUpper()];

if (CompareArray(headerPicture, headerFile))
{
return true;
}
else
{
return false;
}
}

fakhravari
شنبه 07 بهمن 1391, 16:33 عصر
در کل میتونه تغیر بده و در سرور اپلود کنه. > ContentType
ولی بعد از اون نمیتونه تغیر فرمت بده.

na3er-faraji
شنبه 07 بهمن 1391, 16:48 عصر
در کل میتونه تغیر بده و در سرور اپلود کنه. > ContentType
ولی بعد از اون نمیتونه تغیر فرمت بده.

البته اگه آدم بیکاری باشه!!!! میشه یک دلیل برای این کار بگید؟

fakhravari
شنبه 07 بهمن 1391, 19:30 عصر
البته اگه آدم بیکاری باشه!!!! میشه یک دلیل برای این کار بگید؟
واسه سرگرمی شده حداقل یک نفر بیکار پیدا میشه

Dr.Bronx
شنبه 07 بهمن 1391, 21:16 عصر
خوشم میاد که کم نمیاری رفیق :|

morteza_mokhtari
شنبه 07 بهمن 1391, 21:23 عصر
من خودم از هر دو کدی که بالا گذاشتم به صورت دو تا if تو در تو استفاده کردم که امنیتش بیشتر بشه شما ها هم به جای بحث کردن از هر دو روش استفاده کنید موفق باشید

aliimanypoor
شنبه 07 بهمن 1391, 22:18 عصر
سلامی دوباره به تمامی دوستان
جالبه علی رقم توضیحات و بحث های شما دوستان ولی هنوز منظورم را نتونستم برسونم
مهم و اصل مسئله اینه که در هنگام browse کردن فقط فایل های عکس نمایش داده شوند و نه هیچ فایل دیگری که طرف اصلا نتواند فایل دیگری را انتخاب نماید .
ناگفته نماند به جز معدودی افراد کامپیوتری اکثر افراد خیلی ساده و عادی با کامپیوتر کار می کنند و لذا بهترین گزینه اینه که اصلا برای این سری افراد در هنگام انتخاب کردن، فایل های مثلا غیر از عکس نمایش داده نشود که ظاهرا این قابلیت نیست.
در اصل باید بشه یه جوری فایل های نمایش داده شده در صفحه آپبود را فیلتر و محدود کرد.
در کل اینم بگم که میکروسافت ضعف های خنده دار بیشماری دارد و یکی شان یه عملیات ساده ریاضی است در ماشین حساب ویندوز در تمامی ویندوز ها
و این که اسم بیل گیتز را آوردم منظوریست کلی و مزاح گونه و تفاوت نوع نگرش استیو جابز با بیل گیتز است که ظاهرا استیو جابز بهتر عمل کرده و اکثرا میکروسافت محصولات و دستاوردهای اپل را استفاده می کرده و تغییر می داده و به نوعی دزدی می کرده
در کل نکته اینه که افرادی اینچنین ، که زبانی را برای برنامه نویسی تحت وب ابداع می کنند به طور کامل فکر همه جا را نمی کنند و همینجوری یه کاری را شروع می کنند و هدفشان پول است اگر شد بهترش می کند اگه نه که هیچی.معمولا اپل نشان داده بیشتر دنبال تولید خوب است نه تولید پول ساز
این امکانات در برنامه نویسی معمولی سی شارپ ،وی بی ،و دلفی و.... هست و بنظر منطقی میاد گزینه های ساده ای که در زبان های دیگر پیاده کرده اند لااقل اینجا هم پیاده سازی کنند.
مثل نرم افزارهایی نظیر فتوشاپ که شما فقط می توانید عکس ها را باز کنید یا ورد که فایل های خودش را نمایش میدهد و چنانچه چنین قابلیتی پیش بینی نشده باشد باید راهی می گذاشتند تا خودمان تولید کنیم منتها سورس تمامی کارهای میکروسافت بسته است و شما نمی تونید در شی ء ایجاد شده به جز تغییرات از پیش تعریف شده تغییر دیگری اعمال کنید.این سقوط و ضعفی مسخره در این زیان برنامه نویسی است

na3er-faraji
شنبه 07 بهمن 1391, 22:33 عصر
سلامی دوباره به تمامی دوستان
جالبه علی رقم توضیحات و بحث های شما دوستان ولی هنوز منظورم را نتونستم برسونم
مهم و اصل مسئله اینه که در هنگام browse کردن فقط فایل های عکس نمایش داده شوند و نه هیچ فایل دیگری که طرف اصلا نتواند فایل دیگری را انتخاب نماید .
ناگفته نماند به جز معدودی افراد کامپیوتری اکثر افراد خیلی ساده و عادی با کامپیوتر کار می کنند و لذا بهترین گزینه اینه که اصلا برای این سری افراد در هنگام انتخاب کردن، فایل های مثلا غیر از عکس نمایش داده نشود که ظاهرا این قابلیت نیست.
در اصل باید بشه یه جوری فایل های نمایش داده شده در صفحه آپبود را فیلتر و محدود کرد.
در کل اینم بگم که میکروسافت ضعف های خنده دار بیشماری دارد و یکی شان یه عملیات ساده ریاضی است در ماشین حساب ویندوز در تمامی ویندوز ها
و این که اسم بیل گیتز را آوردم منظوریست کلی و مزاح گونه و تفاوت نوع نگرش استیو جابز با بیل گیتز است که ظاهرا استیو جابز بهتر عمل کرده و اکثرا میکروسافت محصولات و دستاوردهای اپل را استفاده می کرده و تغییر می داده و به نوعی دزدی می کرده
در کل نکته اینه که افرادی اینچنین ، که زبانی را برای برنامه نویسی تحت وب ابداع می کنند به طور کامل فکر همه جا را نمی کنند و همینجوری یه کاری را شروع می کنند و هدفشان پول است اگر شد بهترش می کند اگه نه که هیچی.معمولا اپل نشان داده بیشتر دنبال تولید خوب است نه تولید پول ساز
این امکانات در برنامه نویسی معمولی سی شارپ ،وی بی ،و دلفی و.... هست و بنظر منطقی میاد گزینه های ساده ای که در زبان های دیگر پیاده کرده اند لااقل اینجا هم پیاده سازی کنند.
مثل نرم افزارهایی نظیر فتوشاپ که شما فقط می توانید عکس ها را باز کنید یا ورد که فایل های خودش را نمایش میدهد و چنانچه چنین قابلیتی پیش بینی نشده باشد باید راهی می گذاشتند تا خودمان تولید کنیم منتها سورس تمامی کارهای میکروسافت بسته است و شما نمی تونید در شی ء ایجاد شده به جز تغییرات از پیش تعریف شده تغییر دیگری اعمال کنید.این سقوط و ضعفی مسخره در این زیان برنامه نویسی است

همچین امکانی وجود ندارد و این ربطی به مایکروسافت نداره و همون جور که دوستانمون اشاره کردند این به خاطر ضعف های html هستش که خیلی قدیمیه. html نسخه 5 خیلی از این ضعف ها رو برطرف کرده. و باز هم میگم این موضوع ربطی به مایکروسافت یا اپل نداره!!!!

aliimanypoor
یک شنبه 08 بهمن 1391, 12:53 عصر
می دونم این مشکل ربطی به میکروسافت و اپل و امثال آنها نداره ولی شاید می شد هنگامی که زبان asp را ابداع می کردند یه فکری هم به حال مشکلات اینچنینی می کردند و از همان موقع ترکیبی از html ,asp جدید ارائه می کردند که چنین مسخره نبود و لااقل ساختاری را ارائه می کردند که بهتر عمل می کرد ولی همانگونه که گفتم کار میکروسافت فقط پول به جیب زدن نه راه حل درست.

na3er-faraji
یک شنبه 08 بهمن 1391, 13:00 عصر
می دونم این مشکل ربطی به میکروسافت و اپل و امثال آنها نداره ولی شاید می شد هنگامی که زبان asp را ابداع می کردند یه فکری هم به حال مشکلات اینچنینی می کردند و از همان موقع ترکیبی از html ,asp جدید ارائه می کردند که چنین مسخره نبود و لااقل ساختاری را ارائه می کردند که بهتر عمل می کرد ولی همانگونه که گفتم کار میکروسافت فقط پول به جیب زدن نه راه حل درست.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!:متعجب:

mostafa_tak2000
یک شنبه 08 بهمن 1391, 14:12 عصر
از کد زیر برای بررسی اندازه فایل و فرمت فایل استفاده میکنم
99077

mRizvandi
سه شنبه 17 بهمن 1391, 12:19 عصر
خیر. شما اشتباه فکر میکنید. ContentType براساس هدر فایل کار میکند.


آره حق با شماست، یادمه من قبلا این رو تست کرده بودم جواب نگرفته بودم، به هر حال من شخصا توی آپلودهام هر دو رو تست می کنم، هم پسوند فایل رو و هم کانتت تایپ رو.

mRizvandi
سه شنبه 01 اسفند 1391, 14:20 عصر
خوب یادمه که یه بار توی یه سایتی دیدم که فایل آپلود فیلتر شده بود. موضوع مربوط به خیلی وقت پیش بود و اصلا خاطرم نبود، یه جستجویی انجام دادم و منجر به این شد که روشی رو که میشه فایل آپلود رو فیلتر کرد رو پیدا کردم.
مسلما همونطور که شما دوستان هم می دونید، این موضوع به سمت کلاینت برمی گرده و حتما قابل دور زدن هم هست. اما برای راحتی کاربر روش بسیار مناسبی است.

یک کنترل فایل آپلود مثل کد زیر روی صفحه قرار بدید:


<asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" Text="Upload" Width="64px" OnClientClick="return CheckForTestFile();" />


خوب حالا نوبت اینه که با جاوا اسکریپت در سمت کلاینت پنجره OpenDialog رو فیلتر کنید، این کد آماده رو استفاده کنید:




<script language="javascript">
//Trim the input
text function Trim(input)
{
var lre = /^\s*/;
var rre = /\s*$/;
input = input.replace(lre, "");
input = input.replace(rre, "");

return input;
}

// filter the files before Uploading for text file only
function CheckForTestFile()
{
var file = document.getElementById('<%=fileDocument.ClientID%>');
var fileName=file.value;
//Checking for file browsed or not
if (Trim(fileName) =='' )
{
alert("Please select a file to upload!!!");
file.focus();
return false;
}
//Setting the extension array for diff. type of text files
var extArray = new Array(".txt", ".doc", ".rtf", ".pdf", ".sxw", ".odt", ".stw", ".html", ".htm", ".sdw", ".vor");

//getting the file name
while (fileName.indexOf("\\") != -1)
fileName = fileName.slice(fileName.indexOf("\\") + 1);
//Getting the file extension
var ext = fileName.slice(fileName.indexOf(".")).toLowerCase();

//matching extension with our given extensions.
for (var i = 0; i < extArray.length; i++)
{
if (extArray[i] == ext)
{
return true;
}
}

alert("Please only upload files that end in types: "

+ (extArray.join(" ")) + "\nPlease select a new "
+ "file to upload and submit again.");
file.focus();
return false;
}
</script>

منبع مقاله فلیتر کردن فایل آپلود اینجا (http://aspalliance.com/1614_Adding_Filter_Action_to_FileUpload_Control_of _ASPNET_20.1)ست

masoud60
سه شنبه 01 اسفند 1391, 16:42 عصر
کنترل contenttype طرف سرور اجرا میشه و دور زدن اون از همه روشهای گفته شده هم سخت تر هست و نیاز به برنامه نویسی کمتری هم داره


----------------------------
http://www.kohan-co.net

mRizvandi
سه شنبه 01 اسفند 1391, 18:16 عصر
کنترل contenttype طرف سرور اجرا میشه و دور زدن اون از همه روشهای گفته شده هم سخت تر هست و نیاز به برنامه نویسی کمتری هم داره
----------------------------
http://www.kohan-co.net

کاملا درسته، این فقط برای راحتی کاربر هست، که وقتی دیالوگ باز شد، هر چیزی رو نشون نده. اصلا نمی تونه جنبه امنیتی داشته باشه.

fakhravari
چهارشنبه 02 اسفند 1391, 00:23 صبح
برای من که نشد. یعنی file upload فیلتر نشد.

mRizvandi
چهارشنبه 02 اسفند 1391, 18:54 عصر
من بابت پست قبلی عذرخواهی میکنم، راستش اینقدر ذوق زده شده بودم که به جواب رسیدم، به خود کد دقتی نکردم، از این بابت پوزش می خوام.

این کد در سمت کلاینت معتبر بودن پسوندهای مورد نظر رو بررسی میکنه و اصلا FileDialog رو فیلتر نمیکنه.
برای کسانی که می خوان کاربر قبل از ارسال متوجه اشکال در انتخاب نوع فایل بشه، متد و روش خوبی هست، اما ظاهرا هیچ روشی برای فیلتر کردن FileDialog در HTML وجود نداره

FastCode
چهارشنبه 02 اسفند 1391, 19:23 عصر
وقتی مشکلتون اینجاست ۱۰۰٪ اینقدر مشکلات دیگه توی برنامتون هست که از این روش هک نشید.خیلی نگران نباش.
اگر خیلی نگران هستید همه فایل ها رو نگه دارید تا خودتون تاییدشون کنید.

Himalaya
پنج شنبه 03 اسفند 1391, 01:10 صبح
سلام

چه جوری میشه انواع فایلی را که قراره fileuplod اجازه بده تا باز بشه را مشخص کرد
یا فایل هایی که نمایش میده را مثلا لیستی مثل سایر جاها در قسمت نوع فایل
بیاد و نوع jpg را انتخاب کنیم و وفقط آنها نمایش داده شوند


مهم و اصل مسئله اینه که در هنگام browse کردن فقط فایل های عکس نمایش داده شوند و
نه هیچ فایل دیگری که طرف اصلا نتواند فایل دیگری را انتخاب نماید .



اما ظاهرا هیچ روشی برای فیلتر کردن FileDialog در HTML وجود نداره

راه که هست البته با کمک فلش (http://www.uploadify.com/documentation/uploadify/filetypeexts/)

aliimanypoor
جمعه 25 اسفند 1391, 15:40 عصر
سلامی دوباره به همگی دوستان و هم علاقه ها و همکاران
از اینکه مطالب را مطالعه کردید و با دقت نظر مورد بررسی قرار دادید و هر راهی که به ذهنتان رسید برای سایرین نیز بیان نمودید واقعا ممنونم
راستش این حس خوبی به آدم میده وقتی بعد از چند ماه و در حالیکه برنامه را تمام کرده ام و الان روی سرور کار می کنه می بینم که دوستان زیاد دیگری مطلب اضافه کرده اند و دنبال راه کار اند
اولین حس خوبش اینه که می بینم خیلی های دیگه هم به این مشکل برخورد کرده اند و برایشان حائز اهمیت بوده که راهی برای آن بیایند و مطلبی که برای همه مورد احتیاج شود حتما راهی برای آن یا ساخته و یا یافته می شود
راستش را بگویم راهی برای فیلتر کردن پیدا نکردم منتها علاقه مندم ببینم بالاخره اصلا چنین کاری شدنی هست یا نه تا لااقل چنانچه روزی جایی دیدم اینکار انجام شده بدونم چگونه بوده و فرد چقدر حوصله و وقت صرف کرده تا به حل آن رسیده و از چه طریقی بوده گرچه الان فرصت ندارم تا اینکه راه هایی که دوستان ارائه نمودند را امتحان کنم ولی اگه فردی این راه ها را امتحان کرد و به نتیجه رسید ممنون می شم بگه که کدوم بهتر بوده و آیا واقعا به جواب واقعی که فیلتر کردن است رسیده یا نه