با سلام
من می خواهم فایلی را روی سرور برای دانلود بگذارم منتها می خواهم فقط یک سری کاربران خاص
که پسورد مخصوص دارند و این پسورد هم از دیتابیس خوانده می شود بتوانند آن را دانلود کنند
لطفا من را راهنمایی نمایید
Printable View
با سلام
من می خواهم فایلی را روی سرور برای دانلود بگذارم منتها می خواهم فقط یک سری کاربران خاص
که پسورد مخصوص دارند و این پسورد هم از دیتابیس خوانده می شود بتوانند آن را دانلود کنند
لطفا من را راهنمایی نمایید
سلامنقل قول:
اگر امنيت خيلي مهم است، يكي از بهترين راهها ذخيره فايل داخل ديتابيس است.
درصورتيكه اگر فايل داراي آدرس مشخص باشد ( [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] ) نميتوان روي امنيت زياد حساب كرد.
فايل را داخل ديتابيس مثلا بصورت rar همراه با password ذخيره كنيدو با استفاده از يك صفحه رابط كه كلمه عبور را كنترل مي كند بصورت Response.BinaryWrite براي كاربر ارسال كنيد.
يا فايل را خارج از www قرار دهيد و بوسيله يك صفحه رابط فايل را بصورت گفته شده ارسال كنيد.
سلام.از راهنمایتون ممنونم
اما اول یه سوال و اون اینکه ایا برای فایل های با حجم زیاد مشکلی ایجاد نمیشود؟
در ضمن شما میتونید یه نمونه برنامه برای من بفرستید راستش خیلی فوری است .و سریع باید فایلمون را برای دانلود بذاریم
بازم ممنون
سلامنقل قول:
بستگي دارد به چي بگيد حجيم، فكر نكنم 10 -20 مگ مشكلي داشته باشد.
اين هم يك مثال :
ياکد:MyFileStream = New FileStream("G:\Root30\yourdomain\domain\mydomain.com\download\" & Me.Page.Request.QueryString.Item("FName"), FileMode.Open)
FileSize = MyFileStream.Length
Dim Buffer(CInt(FileSize)) As Byte
MyFileStream.Read(Buffer, 0, CInt(FileSize))
MyFileStream.Close()
Me.Page.Response.AddHeader("Content-Disposition", "attachment; filename=" & Me.Page.Request.QueryString.Item("FName") & Chr(34))
Me.Page.Response.ContentType = "application/x-unknown"
Response.BinaryWrite(Buffer)
کد:Me.Page.Response.AddHeader("Content-Disposition", "attachment; filename=" & Me.Page.Request.QueryString.Item("FName") & Chr(34))
Me.Page.Response.ContentType = "application/x-unknown"
Response.TransmitFile("G:\Root30\yourdomain\domain\mydomain.com\download\" & Me.Page.Request.QueryString.Item("FName"))
سلام
در کل سریعترین راه اضافه کردن یک فایل ashx است (Generic Handler)
بعد از اضافه کردن فایل شما باید داخل رویه ProcessRequest و با توجه به مقادیر context دستورات لازم را
بنویسید. به کد نمونه زیر دقت کنید
این کد فایل درخواستی را از QueryString میگیرد و در صورت True بودن Allow در شی Session دانلود را شروعکد:Public Sub ProcessRequest(ByVal ...
Dim file As String = context.Request.QueryString("File")
Dim IsValidUser As Boolean
'...
'Sample
IsValidUser = CBool(context.Session("Allow"))
If IsValidUser Then context.Response.TransmitFile(context.Server.MapPath("~\Downloads\" & file))
End Sub
میکند.
1- فرض شده تمامی فایلها در پوشه Download و در ریشه سایت هستند. و واضح است که با تنظیم IIS یا یک فایل web.config باید جلوی ورود به پوشه Dowwnload ها بسته شود تا کاربران نتوانند با حدس زدن مسیر مدیر ashx ما را دور بزنند!
2- کد ها باید اصلاح شوند.
3- باید پیش بینی های خطا صورت گیرد
4- اعتبار سنجی کاربر را با الگوریتم خود اصلاح کنید.
بعد هر کجا خواستید لینک دانلود بدهید،
باید به جایب مسیر اصلی این لینک را بگذارید handlerpagename.ashx?File=filename.zip
handlerpagename نام اصلی فایل ashx شما است و filename.zip نام فایل درخواستی
من خودم اولین بار که سایتم را آپلود کردم از این روش استفاده کردم ولی بعد تغییرش دادم و حالا که وقت بیشتری
داشته ام از کد بسیار جالب دیگری استفاده کرده ام. ولی این چیزی از قدرت و سرعت فایلهای ashx نمی کاهد.
سلام خسته نباشیدنقل قول:
راستش میدونم که انتظارم خیلی نابجا است ولی اگه این برنامتون را برای من ارسال کنید خیلی ممنون میشوم
البته اگه مایل هستید.
راستش من درگیر یک برنامه دیگر هستم و از اونجایی که تازه وارد هستم نمیتونم درگیر برنامه جدیدی شوم از طرفی یه فایل برای دانلود داریم که حتما باید برای کاربران خاصمون قرار دهیم.
در ضمن میشه درمورد فایل های ashx بیشتر توضیح بدهید
خیلی ممنون
سلام
برنامه من به کار شما نمی آید!
تازه سورس اولیه را دیگر ندارم و کد جدید از روش پیچیده تری استفاده میکند که جنبه های خاص امنیتی را هم لحاظ کرده.
من نمی خواستم اجازه دانلود را برای کاربران خاص فراهم کنم (همه اجازه دانلود مستقیم را دارند) فقط میخواستم آمار دقیق دانلودها را داشته باشم. (چندبار؟ آخرین تاریخ دانلود؟ و...)
طبیعی است که بادادن مسیر مستقیم پوشه به هدفم نمی رسیدم (و همچنین شما!)
ولی بنیان کار یکی است و آن در دست گیری اتوبان دانلودها است!!!!! حال چه برای شمارش و آمار گیری و چه برای جلوگیری از دانلود افراد غیر مجاز.
به همان کد نمونه رجوع کنید. به نظر من که اصل مطلب را به روشنی توضیح داده.
سلام
من می خواهم هر کاربر فایل مربوط به خودش را بتواند دانلود کند تکه کدی رانوشتم که همهکاربران 1فایل را می توانند دانلود کنند.
لطفا کمکم کنید.
سلام
فایل مخصوص خودش یعنی چه؟نقل قول:
من می خواهم هر کاربر فایل مربوط به خودش را بتواند دانلود کند تکه کدی رانوشتم که همهکاربران 1فایل را می توانند دانلود کنند
یعنی هر کاربر فقط یک تک فایل خاص را باید دانلود کند؟ یا یک گروه فایل؟
فایلهای دو کاربر مختلف یک نام هستند یا تفاوت نام هم دارید؟
...
شرایط را بیشتر تشریح کنید تا بتوان کوتاه ترین راه حل را پیشنهاد داد.
(((
طبیعتاً یکی از کاملترین راه ها ذخیره اطلاعات فایلها و مجوزهای دسترسی و... در جداول دیتابیس است که بعد برنامه برای هر کاربر مجوزها و بررسی و Stream مربوطه را ارسال کند...
)))
موفق باشید
سلام
سایتی که می خواهم طراحی کنم این هست که تعدادی مشتری ثبت نام می کنند و سپس فایلی را می خواهند ترجمه کنند را آپلود می کنند و سپس تعدای از مترجمین هم برای همکاری ثبت نام می کنند و وقتی که مترجم فایلهای مربوط به مشتریان را ترجمه کرد فایلها را آپلود می کند سپس هر مشتری باید بتواند فایل مخصوص خودرا که مترجم برای آن ترجمه کرده را دانلود کنند.
احتمالا باید از sessionاستفاده کنم ولی نمیدونم طرز استفاده از آن چطوری است.
ممنونم
سلام
اول آنکه تمام مطالب زیر بر محوریت دانلود است.نقل قول:
سایتی که می خواهم طراحی کنم این هست که تعدادی مشتری ثبت نام می کنند و سپس فایلی را می خواهند ترجمه کنند را آپلود می کنند و سپس تعدای از مترجمین هم برای همکاری ثبت نام می کنند و وقتی که مترجم فایلهای مربوط به مشتریان را ترجمه کرد فایلها را آپلود می کند سپس هر مشتری باید بتواند فایل مخصوص خودرا که مترجم برای آن ترجمه کرده را دانلود کنند.
در این شرایط به مکانیزم کامل تری نیاز دارید و باز هم به دلایلی مشخص شد به پیچیده ترین شرایط نیاز ندارید ... در واقع رابطه کاربر-فایل شما یک به چند است.
(نه یک به یک و نه چند به چند)
مسدود کردن دسترسی کاربران به فایلهای خودشان را باید به نوعی ذخیره کنید و بتوانید با کد مشخص کنید ...
الف) باید بتوانید فهرستی از فایلهای هر فرد بدست آورید
ب) باید بتوانید مشخص کنید هر فرد اجازه دانلود یک فایل مشخص را دارد یا خیر ...
==============
راه حل اول)
حتماً جدولی برای کاربران در دیتابیس دارید که حاوی فهرست User, Pass ها است؟!
یک جدول دیگر هم برای فایلها اضافه کنید که {حاوی نام فایل/مسیر فایل در هارد/کاربر مالک} فایل باشد.
الف) بعد از لوگین کاربرتان میتوانید با یک SELECT ساده همه فایلهای مرتبط با او را استخراج کنید و در جدولی نشان اش دهید ...
ب) در زمان دانلود هم به سادگی ID فایل مورد نظر را در دیتابیس چک میکنید تا مطمئ شوید کاربر جازه دانلودش را دارد
حداقل جداول پیشنهادی:
راه حل دوم)کد:Users
=====
ID_User [AutoNumber+PrimaryKey]
Username
Password
Files
=====
ID_File [AutoNumber+PrimaryKey]
ID_User
Path
یک پوشه به نام هر Username یا ID_User در هارد تشکیل میدهید و فایل های هر فرد را درون پوشه خودش میریزید.
الف) باز هم به سادگی با استراج فایل های چوشه هر فرد میتوانید فهرست فایلهای او را نشان دهید
ب) و در زمان دانلود هم روت مسیر دانلود را پوشه مخصوص او فرض میکنید و با این کار فرد به دانلود محتویات همان پوشه محدود میشود.
(گرچه باید نکته کوچکی را در کدتان لحاظ کنید تا کسی نتواند این قابلیت را دور بزند ولی فعلاً این نکته خیلی مهم نیست)
==============
کد نمونه (فقط به عنوان یک بذر اولیه یا سرنخ که باید پیگیری و تکمیلش کنید):
یک Generic Handler با کدی شبیه این اضافه کنید:
موفق باشید.کد:public class Handler1
: System.Web.IHttpHandler
{
private const string ROOTPATH = "~\\FilesDirectory\\";
public bool IsReusable { get { return true; } }
public void ProcessRequest(System.Web.HttpContext context)
{
//Authentication ...
if ((context.User == null) || (context.User.Identity == null) || (!context.User.Identity.IsAuthenticated)) return;
string username = context.User.Identity.Name;
if (string.IsNullOrEmpty(username)) return;
string file = context.Request.QueryString["file"];
if (string.IsNullOrEmpty(file)) return;
string filepath = null;
//
//1) IF (Authorization ...) THEN
//2) filepath = ROOTPATH + ???
// END IF
//
if (string.IsNullOrEmpty(filepath)) return;
filepath = context.Request.MapPath(filepath);
if (!System.IO.File.Exists(filepath)) return;
context.Response.ContentType = "application/x-zip-compressed";
context.Response.TransmitFile(filepath);
}
}