PDA

View Full Version : سوال: مخفی کردن لینک مستقیم دانلود از یک url



saradashti
چهارشنبه 13 فروردین 1393, 16:53 عصر
سلام
با استفاده از نمونه کد زیر میتوان ادرس دانلود فایلهایی که بر روی هاست جاری است را مخفی کرد ولی حالا میخواهم فایلهایی که بر روی سرورهای دیگر است را به صورت آدرس URL به آن بدهم و فایل را به صورت لینک مخفی دانلود کند
درصورت زیر برای کار با URL خطای is not a valid virtual path میدهد

String FileName1 = "logoooooooo.zip";

String FilePath1 = "images/logo.zip";


String FileName = FileName1;
String FilePath = FilePath1;
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
response.TransmitFile(FilePath);
response.Flush();
response.End();


در نمونه کد بالا اگر FilePath را به صورت http://sitename.com/file.zip بدهم، خطای is not a valid virtual path را میدهد
طی تحقیقات انجام داده متوجه شدم که باید فایل را از آدرس داده شده روی سرور خودم دانلود کنم و یا عملیات همزمان سازی را برایش انجام دهم .

حال سوال اینجاست آیا کسی از دوستان این کار را انجام داده؟
چطور میشه دیتایی که داره برای ما ارسال میشه عینا برای کاربر بفرستیم یعنی یه جورایی نقش رابط رو بازی کنیم تا لازم نباشه فایل رو جایی ذخیره کنیم

FaraDev.com
دوشنبه 18 فروردین 1393, 10:28 صبح
سلام خانم دشتی
این کد را من تست کردم، عالی جواب میده. بفرمایید:

protected void DownloadFile(string name)
{
string _fileName;
string _path = Request.PhysicalApplicationPath + "Upload/" + name;
System.IO.FileInfo _file = new System.IO.FileInfo(_path);
if (_file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + _file.Name);
Response.AddHeader("Content-Length", _file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(_file.FullName);
Response.End();
}
else
{
ClientScript.RegisterStartupScript(Type.GetType("System.String"), "messagebox", "<script type=\"text/javascript\">alert('File not Found');</script>");
{

saradashti
سه شنبه 19 فروردین 1393, 12:16 عصر
این روش هم فقط برای آدرسهای فیزیکی هاست جاری جواب میده و در صورتی که آدرس url فایل دانلود را به آن بدهیم, جواب نمیده

saradashti
سه شنبه 19 فروردین 1393, 12:18 عصر
این روش هم فقط برای آدرسهای فیزیکی هاست جاری جواب میده و در صورتی که آدرس url فایل دانلود را به آن بدهیم, جواب نمیده


سلام خانم دشتی
این کد را من تست کردم، عالی جواب میده. بفرمایید:

protected void DownloadFile(string name)
{
string _fileName;
string _path = Request.PhysicalApplicationPath + "Upload/" + name;
System.IO.FileInfo _file = new System.IO.FileInfo(_path);
if (_file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + _file.Name);
Response.AddHeader("Content-Length", _file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(_file.FullName);
Response.End();
}
else
{
ClientScript.RegisterStartupScript(Type.GetType("System.String"), "messagebox", "<script type=\"text/javascript\">alert('File not Found');</script>");
{

Mohammad_dn
سه شنبه 19 فروردین 1393, 12:20 عصر
خوب اگه دقت کرده باشید آپلود سنتر ها یه قسمت(آپلود از لینک)دارند که فایل کاربر رو از سایت دیگه و از طریق لینک به سایت (سرور) خودشون انتقال میدن.....فکر کنم اگه این کارو انجام بدید خوب باشه

saradashti
سه شنبه 19 فروردین 1393, 12:37 عصر
دقیقا راهش همینه ولی نکته اینجاست که این کار را در کدنویسی چطور انجام بدیم؟
درواقع باید به شکلی همزمانسازی دریافت از سرور و دانلود توسط کاربر را داشته باشیم ولی چه دستور کدی این کار را انجام میده؟


خوب اگه دقت کرده باشید آپلود سنتر ها یه قسمت(آپلود از لینک)دارند که فایل کاربر رو از سایت دیگه و از طریق لینک به سایت (سرور) خودشون انتقال میدن.....فکر کنم اگه این کارو انجام بدید خوب باشه

Mohammad_dn
سه شنبه 19 فروردین 1393, 12:57 عصر
public static bool SaveFileFromUrl(string MapPath, string Url, int FileSize = 500, string FileName = "")
{
string NewAdress = "";
try
{
if (MapPath != ".")
{
if (!Directory.Exists(HttpContext.Current.Server.MapP ath("~/" + MapPath + "/")))
{
Directory.CreateDirectory(System.Web.HttpContext.C urrent.Server.MapPath("~/" + MapPath + "/"));
NewAdress = "~/" + MapPath + "/";
}
else
{ NewAdress = "~/" + MapPath + "/"; }
}
else { NewAdress = "~/"; }

WebClient wc = new WebClient();
string[] Arry = Url.Split('/');

System.IO.Stream stream = wc.OpenRead(Url);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(stream);

MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Bmp);

if (bmp.Height > 500) { return false; }
if (bmp.Width > 800) { return false; }
if ((int)ms.ToArray().Length < FileSize) { return false; }

if (FileName.Length > 0)
{ wc.DownloadFile(Url, HttpContext.Current.Server.MapPath(NewAdress + FileName + Path.GetExtension(Arry[Arry.Length - 1]))); }
else
{ wc.DownloadFile(Url, HttpContext.Current.Server.MapPath(NewAdress + Arry[Arry.Length - 1])); }
return true;
}
catch { return false; }
}


کد بالارو (آقای فخراوری)نوشتند

فضای نام های زیر رو هم به صفحت اضافه کن


using System.IO;
using System.Drawing.Imaging;
using System.Net;

saradashti
سه شنبه 19 فروردین 1393, 13:57 عصر
ممنون از راهنمایی خوبتون
امتحان میکنم و نتیجه را همینجا اعلام میکنم

saradashti
چهارشنبه 20 فروردین 1393, 12:44 عصر
کد شما را با کمی تغییر امتحان کردم و کامل جواب داد.
حالا سه تا نکته پیش میاد:
1- با این روش فایل اول کامل روی سرور ما آپلود میشه و بعد برای کاربر صفحه دانلود فایل نمایش داده میشه. این کار برای فایلها با حجم کم مشکلی نیست ولی برای فایلها با حجم بالا ، تاخیر زیادی برای کاربر ایجاد میکنه و چیز جالبی نیست.
راه حلی هست که دانلود فایل از سرور مبدا بر روی سرور مقصد و دانلود توسط کاربر به صورت همزمان و موازی انجام بشه؟

2- بعد از پایان دانلود فایل لازمه که فایل آپلود شده روی سرور ما حذف بشه. این پایان دانلود را از کجا بفهمیم؟

3- نکته مهمتر اینکه اصلا این عملیات برای سایتهای پر بازدید، بار پردازشی زیادی نداره؟




public static bool SaveFileFromUrl(string MapPath, string Url, int FileSize = 500, string FileName = "")
{
string NewAdress = "";
try
{
if (MapPath != ".")
{
if (!Directory.Exists(HttpContext.Current.Server.MapP ath("~/" + MapPath + "/")))
{
Directory.CreateDirectory(System.Web.HttpContext.C urrent.Server.MapPath("~/" + MapPath + "/"));
NewAdress = "~/" + MapPath + "/";
}
else
{ NewAdress = "~/" + MapPath + "/"; }
}
else { NewAdress = "~/"; }

WebClient wc = new WebClient();
string[] Arry = Url.Split('/');

System.IO.Stream stream = wc.OpenRead(Url);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(stream);

MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Bmp);

if (bmp.Height > 500) { return false; }
if (bmp.Width > 800) { return false; }
if ((int)ms.ToArray().Length < FileSize) { return false; }

if (FileName.Length > 0)
{ wc.DownloadFile(Url, HttpContext.Current.Server.MapPath(NewAdress + FileName + Path.GetExtension(Arry[Arry.Length - 1]))); }
else
{ wc.DownloadFile(Url, HttpContext.Current.Server.MapPath(NewAdress + Arry[Arry.Length - 1])); }
return true;
}
catch { return false; }
}


کد بالارو (آقای فخراوری)نوشتند

فضای نام های زیر رو هم به صفحت اضافه کن


using System.IO;
using System.Drawing.Imaging;
using System.Net;

saradashti
شنبه 30 فروردین 1393, 10:39 صبح
کسی نیست کمک و راهنمایی بکنه؟؟؟؟
:ناراحت: