سلام
اول آنکه تمام مطالب زیر بر محوریت دانلود است.نقل قول:
سایتی که می خواهم طراحی کنم این هست که تعدادی مشتری ثبت نام می کنند و سپس فایلی را می خواهند ترجمه کنند را آپلود می کنند و سپس تعدای از مترجمین هم برای همکاری ثبت نام می کنند و وقتی که مترجم فایلهای مربوط به مشتریان را ترجمه کرد فایلها را آپلود می کند سپس هر مشتری باید بتواند فایل مخصوص خودرا که مترجم برای آن ترجمه کرده را دانلود کنند.
در این شرایط به مکانیزم کامل تری نیاز دارید و باز هم به دلایلی مشخص شد به پیچیده ترین شرایط نیاز ندارید ... در واقع رابطه کاربر-فایل شما یک به چند است.
(نه یک به یک و نه چند به چند)
مسدود کردن دسترسی کاربران به فایلهای خودشان را باید به نوعی ذخیره کنید و بتوانید با کد مشخص کنید ...
الف) باید بتوانید فهرستی از فایلهای هر فرد بدست آورید
ب) باید بتوانید مشخص کنید هر فرد اجازه دانلود یک فایل مشخص را دارد یا خیر ...
==============
راه حل اول)
حتماً جدولی برای کاربران در دیتابیس دارید که حاوی فهرست 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);
}
}