PDA

View Full Version : حق دسترسی کاربر به فایل دانلود



amir_T_2008
جمعه 30 آبان 1393, 04:26 صبح
سلام دوستان

من یک سوالی داشتم ممنون میشم پاسخ بدید

من یک صفحه دانلود دارم حالا میخوام همه کاربرا که از هر رولی مثل (user , admin)بتونن اونو ببینن اما فقط کاربرایی حق دانلود اون فایلی که دارمو داشته باشند که عضو vip هستن و حالا اگر بشه اونایی که حق عضویت ندادن یا عضو نیستن به جای لینک دانلود یک پیغام بزنه که ثبت نام کنید یا حق عضویت پرداخت کنید

راستش خیلی گشتم چیزی پیدا نکردم و چون حرفه ای نیستم لطفا آموزش یا کد قرار بدید

پیشاپیش متشکرم

Mohammad_dn
جمعه 30 آبان 1393, 10:53 صبح
شما باید لینک غیر مستقیم بسازی....

amir_T_2008
جمعه 30 آبان 1393, 17:26 عصر
شما باید لینک غیر مستقیم بسازی....

دوست عزیز فکر کنم شما منظور منو متوجه نشدید .من میخوام لینک دانلود همه ببینن اما به طور مثال فقط رول vip که من بهش دادم بتونه دانلود کنه و بقیه که روی لینک کلیک میکنن وارد یک صفحه ارور یا هر چی دیگه بشه.
بعد من دنبال آموزش یا سورس هستم چون توی پیاده سازی مشکل دارم

Mohammad_dn
جمعه 30 آبان 1393, 17:50 عصر
خوب منم منظورم همین بود دیگه...فقط کوتاه گفتم....شما مثلا فایلی توی پوشه ی Uploads/MDN.zip داری...وقتی کاربر میخواد دانلود کنه شما لینک مستقیم مثل www.mysite.com/uploads/MDN.zip نده...آدرسی مثل www.mysite.com/download.aspx?filename=MDN.zip بده..بعد توی این صفحه اگر کاربر لاگ این کرده بود اونوقت فایل رو برای دانلود بزار..از طریق کد زیر:




protected void Button1_Click(object sender, EventArgs e)
{

bool bln = DownloadFile(var, Server.MapPath(reader["Address"].ToString()), 10000000000000000);


}




public bool DownloadFile(HttpContext httpContext, string filePath, long speed)
{
bool ret = true;
try
{
switch (Request.HttpMethod.ToString().ToUpper())
{ //support Get and head method
case "GET":
case "HEAD":
case "POST":
break;
default:
Response.StatusCode = 501;
return false;
}
if (!System.IO.File.Exists(filePath))
{
Response.StatusCode = 404;
return false;
}



long startBytes = 0;
int packSize = 1024 * 10; //read in block,every block 10K bytes
string fileName = Path.GetFileName(filePath);
FileStream myFile = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(myFile);
long fileLength = myFile.Length;

int sleep = (int)Math.Ceiling(1000.0 * packSize / speed);//the number of millisecond
string lastUpdateTiemStr = System.IO.File.GetLastWriteTimeUtc(filePath).ToStr ing("r");
string eTag = HttpUtility.UrlEncode(fileName, Encoding.UTF8) + lastUpdateTiemStr;

//validate whether the file is too large
if (myFile.Length > Int32.MaxValue)
{
Response.StatusCode = 413;
return false;
}

if (Request.Headers["If-Range"] != null)
{

if (Request.Headers["If-Range"].Replace("\"", "") != eTag)
{
Response.StatusCode = 412;
return false;
}
}

try
{

Response.Clear();
Response.Buffer = false;
//Response.AddHeader("Content-MD5", GetMD5Hash(myFile));
Response.AddHeader("Accept-Ranges", "bytes");
Response.AppendHeader("ETag", "\"" + eTag + "\"");
Response.AppendHeader("Last-Modified", lastUpdateTiemStr);
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" +

HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", "%20"));
Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
Response.AddHeader("Connection", "Keep-Alive");
Response.ContentEncoding = Encoding.UTF8;
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startBytes = Convert.ToInt64(range[1]);
if (startBytes < 0 || startBytes >= fileLength)
{
return false;
}
}
if (startBytes > 0)
{
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
}


//send data
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int)Math.Ceiling((fileLength - startBytes + 0.0) / packSize);//download in block
for (int i = 0; i < maxCount && Response.IsClientConnected; i++)
{
Response.BinaryWrite(br.ReadBytes(packSize));
Response.Flush();
if (sleep > 1) Thread.Sleep(sleep);
}

}
catch
{
ret = false;
}
finally
{
br.Close();
myFile.Close();
}
}
catch
{
ret = false;
}
return ret;
}
private static string GetMD5Hash(FileStream myFile)
{
throw new NotImplementedException();
}
public HttpContext var { get; set; }

amir_T_2008
جمعه 30 آبان 1393, 18:19 عصر
خوب منم منظورم همین بود دیگه...فقط کوتاه گفتم....شما مثلا فایلی توی پوشه ی Uploads/MDN.zip داری...وقتی کاربر میخواد دانلود کنه شما لینک مستقیم مثل www.mysite.com/uploads/MDN.zip (http://www.mysite.com/uploads/MDN.zip) نده...آدرسی مثل www.mysite.com/download.aspx?filename=MDN.zip (http://www.mysite.com/download.aspx?filename=MDN.zip) بده..بعد توی این صفحه اگر کاربر لاگ این کرده بود اونوقت فایل رو برای دانلود بزار..از طریق کد زیر:



protected void Button1_Click(object sender, EventArgs e)
{

bool bln = DownloadFile(var, Server.MapPath(reader["Address"].ToString()), 10000000000000000);


}




public bool DownloadFile(HttpContext httpContext, string filePath, long speed)
{
bool ret = true;
try
{
switch (Request.HttpMethod.ToString().ToUpper())
{ //support Get and head method
case "GET":
case "HEAD":
case "POST":
break;
default:
Response.StatusCode = 501;
return false;
}
if (!System.IO.File.Exists(filePath))
{
Response.StatusCode = 404;
return false;
}



long startBytes = 0;
int packSize = 1024 * 10; //read in block,every block 10K bytes
string fileName = Path.GetFileName(filePath);
FileStream myFile = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(myFile);
long fileLength = myFile.Length;

int sleep = (int)Math.Ceiling(1000.0 * packSize / speed);//the number of millisecond
string lastUpdateTiemStr = System.IO.File.GetLastWriteTimeUtc(filePath).ToStr ing("r");
string eTag = HttpUtility.UrlEncode(fileName, Encoding.UTF8) + lastUpdateTiemStr;

//validate whether the file is too large
if (myFile.Length > Int32.MaxValue)
{
Response.StatusCode = 413;
return false;
}

if (Request.Headers["If-Range"] != null)
{

if (Request.Headers["If-Range"].Replace("\"", "") != eTag)
{
Response.StatusCode = 412;
return false;
}
}

try
{

Response.Clear();
Response.Buffer = false;
//Response.AddHeader("Content-MD5", GetMD5Hash(myFile));
Response.AddHeader("Accept-Ranges", "bytes");
Response.AppendHeader("ETag", "\"" + eTag + "\"");
Response.AppendHeader("Last-Modified", lastUpdateTiemStr);
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" +

HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", "%20"));
Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
Response.AddHeader("Connection", "Keep-Alive");
Response.ContentEncoding = Encoding.UTF8;
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startBytes = Convert.ToInt64(range[1]);
if (startBytes < 0 || startBytes >= fileLength)
{
return false;
}
}
if (startBytes > 0)
{
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
}


//send data
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int)Math.Ceiling((fileLength - startBytes + 0.0) / packSize);//download in block
for (int i = 0; i < maxCount && Response.IsClientConnected; i++)
{
Response.BinaryWrite(br.ReadBytes(packSize));
Response.Flush();
if (sleep > 1) Thread.Sleep(sleep);
}

}
catch
{
ret = false;
}
finally
{
br.Close();
myFile.Close();
}
}
catch
{
ret = false;
}
return ret;
}
private static string GetMD5Hash(FileStream myFile)
{
throw new NotImplementedException();
}
public HttpContext var { get; set; }




دوست عزیز ممنون.
اخه من تو همین سایت خوندم که یکی از بچه ها گفته بود میتونید اینطوری دسترسی به کاربر خاصی بدید ولی من وقتی از کد زیر تو وب کانفیگ استفاده میکردم ارور میداد.گفتم شاید روش راحت باشه چون راستش من تو C# خیلی مبتدی هستم.




<system.web>
<authorization>
<allow roles="<span class="highlight">vip</span>"/>
<deny users="*"/>
</authorization>
</system.web>





با شرمندگی سورسی هم برای مثال بالا که گفتید دارید؟خواهشن شرمنده

Mohammad_dn
جمعه 30 آبان 1393, 19:03 عصر
فکر نمیکنم از روشی که گفتید بشه...(یا حداقل من نمیدونم)

amir_T_2008
جمعه 30 آبان 1393, 19:12 عصر
فکر نمیکنم از روشی که گفتید بشه...(یا حداقل من نمیدونم)

ممنونم.سورسی از کدی که خودتون گفتید ندارید؟

Mohammad_dn
جمعه 30 آبان 1393, 19:16 عصر
اینم نمونه کد....یک بار قبل از لوگ این روی لینک دانلود کلیک کنید یک بار بعد از لوگ این

amir_T_2008
جمعه 30 آبان 1393, 19:32 عصر
اینم نمونه کد....یک بار قبل از لوگ این روی لینک دانلود کلیک کنید یک بار بعد از لوگ این

دوست عزیز بسیار بسیار سپاسگذارم .لطف کردید.فقط کجا میتونم بهش بگم فقط کاربرانی که رول vip دارن بتونن استفاده کنن نه همه اونایی که ثبت نام کردن؟

Mohammad_dn
جمعه 30 آبان 1393, 19:34 عصر
تو ی صفحه ی دالود توی شرطی که توی Page_Load هست...باید مبحث رول بندی رو بلد باشید

amir_T_2008
جمعه 30 آبان 1393, 19:40 عصر
بعد دوست عزیز الان کد شما رو تست کردم کلا روی دانلود میزنی دانلود میکنه بدونه اینکه چک کنه طرف لاگین هست یا نه و ایکه رولش چی هست

Mohammad_dn
جمعه 30 آبان 1393, 19:44 عصر
نخیر اگه شما قبل از اینکه روی دکمه ی Login کلیک کنی لینک بالاشو بزنی میبینی که خطا میده

amir_T_2008
جمعه 30 آبان 1393, 19:48 عصر
نخیر اگه شما قبل از اینکه روی دکمه ی Login کلیک کنی لینک بالاشو بزنی میبینی که خطا میده

ممنون.سایتی هست معرفی کنید تا بتونم رول بندی یاد بگیرم ؟چون فقط همینو گیر کردم که فقط اجازه بدم یک رول دانلود کنه و بقیه نتونن

Mohammad_dn
جمعه 30 آبان 1393, 19:57 عصر
نه متاسفه الآن سایتی یادم نیست

amir_T_2008
جمعه 30 آبان 1393, 20:02 عصر
بسیار ممنون خیلی لطف کردید.

اگر دوستان دیگه تو این زمینه اطلاعاتی دارن ممنون میشم کمک کنن

Mohammad_dn
جمعه 30 آبان 1393, 22:44 عصر
خودم یه توضیح مختصرو مفید میدم..به زودی

amir_T_2008
جمعه 30 آبان 1393, 23:34 عصر
خودم یه توضیح مختصرو مفید میدم..به زودی

واقعا ممنون دوست عزیز

korosh00
شنبه 01 آذر 1393, 12:44 عصر
سلام
الان چندماهه من دنبال این ساخت لینک دانلود مجازی با استاندارد و امنیت خوب و بالا هستم .
چندین بارم سوال شده ولی هنوز یکی یک جواب که پاسخ سوال باشه و این مشکل رو کلا حل نکنه نداده .
از دوستان و مدیران درخواست داریم ورود پیدا کنند و حلش کن.
ممنون

Mohammad_dn
شنبه 01 آذر 1393, 13:28 عصر
سلام
الان چندماهه من دنبال این ساخت لینک دانلود مجازی با استاندارد و امنیت خوب و بالا هستم .
چندین بارم سوال شده ولی هنوز یکی یک جواب که پاسخ سوال باشه و این مشکل رو کلا حل نکنه نداده .
از دوستان و مدیران درخواست داریم ورود پیدا کنند و حلش کن.
ممنون

من که براتون یه نمونه گذاشتم

amir_T_2008
شنبه 01 آذر 1393, 14:07 عصر
محمد جان امكانش نيست خود شما اون داستان رولم به نمونتون اضافه كنيد؟؟؟

Mohammad_dn
شنبه 01 آذر 1393, 14:34 عصر
اینم نمونه.....تنظیمات دیتابیس هم مطابق این (http://barnamenevis.org/showthread.php?476547)تاپیک انجام بدید

amir_T_2008
شنبه 01 آذر 1393, 17:22 عصر
اینم نمونه.....تنظیمات دیتابیس هم مطابق این (http://barnamenevis.org/showthread.php?476547)تاپیک انجام بدید

دوست عزیز ممنون اما نیاز به تغییرات داره