PDA

View Full Version : سوال: خطا در افزودن شمارنده دانلود فایل



giaspirit
سه شنبه 05 فروردین 1393, 12:46 عصر
با سلام خدمت همه دوستان عزیز و عرض تبریک سال نو
یک کد شمارنده دانلود فایل نوشتم که متاسفانه در مرورگر Chrome فقط به درستی کار میکنه و در مرورگرهای Firefox، Opera، IE متاسفانه تعداد دانلود رو بیشتر از یک واحد در هر بار افزایش میده، مثلا گاهی در FF تا 5 بار با یک کلیک کاربر به تعداد دانلود اضافه میکنه و همینطور در Opera و IE.



<asp:HyperLink ID="NewsImageHL" runat="server" NavigateUrl='<%#string.Format("DownloadHandler.ashx?FileCode={0}&DownloadLink={1}",Eval("FileCode"),Server.MapPath("~/HighSchool/Files/") + Eval("FileName")) %>' Text='<%# "دانلود فایل" + "(" +Eval("DownloadNum") + ")" %>' ></asp:HyperLink>




<%@ WebHandler Language="C#‎‎" Class="DownloadHandler" %>

using System;
using System.IO;
using System.Web;

/// <summary>
/// افزودن شمارش دانلود فایل
/// </summary>
public class DownloadHandler : IHttpHandler {

public void ProcessRequest(HttpContext context)
{
int FileCode;
int.TryParse(context.Request.QueryString["FileCode"], out FileCode);
IncrementCounter(FileCode);
SendFileToUser(context,FileCode);
}

public bool IsReusable
{
get { return true; }
}

/// <summary>
/// ارسال فایل برای کاربر
/// </summary>
/// <param name="context">The <see cref="HttpContext"/> that
/// contains the request.</param>
private void SendFileToUser(HttpContext context,int FileCode)
{
var filePath = context.Request.QueryString["DownloadLink"]; //you know where your files are
var file = new FileInfo(filePath);


if (FileCode == null || FileCode == 0) return;

//return the file
context.Response.Clear();
//context.Response.Buffer = false;
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Length", file.Length.ToString());
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
context.Response.WriteFile(file.FullName);
context.ApplicationInstance.CompleteRequest();
context.Response.Flush();
context.Response.End();
}

/// <summary>
/// افزودن شمارنده
/// </summary>
/// <param name="context">The <see cref="HttpContext"/> that contains t
/// he current request</param>
private void IncrementCounter(int FileCode)
{
try
{
COM.DownloadFileCounter(FileCode);
}
catch (Exception ex)
{
throw (ex);
}
}

}



COM Class
public static void DownloadFileCounter(long FileCode)
{
DataConnction.ExecuteNonQuery("Update FilesTB set DownloadNum=DownloadNum+1 where FileCode='" + FileCode + "' ");
}



DataConnection Class
public static void ExecuteNonQuery(string Query)
{
var Con = new SqlConnection
{
ConnectionString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString
};
Con.Open();
var Com = new SqlCommand(Query,Con);
Com.ExecuteNonQuery();
Con.Close();
Con.Dispose();
}

با تشکر از همه دوستان

mRizvandi
چهارشنبه 06 فروردین 1393, 00:40 صبح
با برنامه های دانلود منیجر تست گرفتی؟
البته با این دانلودر شما میشه فایلهای دیگه ای هم دانلود گرفت، مواظب باشید!!!

giaspirit
چهارشنبه 06 فروردین 1393, 13:28 عصر
با برنامه های دانلود منیجر تست گرفتی؟
البته با این دانلودر شما میشه فایلهای دیگه ای هم دانلود گرفت، مواظب باشید!!!

بله؛ خود Firefox بصورت پیش فرض Internet Download Manager رو باز میکنه و دانلود رو میبره رو دانلود منیجر بقیه مرورگر ها هم که منیجر خودشون رو دارن. جالب اینجاس که رو Chrome درس کار میکنه اما بقیه نه!!!
منظورتونو نفهمیدم! خب من میخوام هر فایلی که آپ شده رو بتونه دانلود کنه حالا چه Pdf، چه Zip و ...

mRizvandi
چهارشنبه 06 فروردین 1393, 14:19 عصر
بله؛ خود Firefox بصورت پیش فرض Internet Download Manager رو باز میکنه و دانلود رو میبره رو دانلود منیجر بقیه مرورگر ها هم که منیجر خودشون رو دارن. جالب اینجاس که رو Chrome درس کار میکنه اما بقیه نه!!!
منظورتونو نفهمیدم! خب من میخوام هر فایلی که آپ شده رو بتونه دانلود کنه حالا چه Pdf، چه Zip و ...
برنامه های دانلود منیجر متاسفانه این مورد رو دارن، چون اول درخواست می کنند و اطلاعات فایل رو می گیرند، بعد اگر شما تایید کردی، دوباره فایل رو می گیرند. برای همین گاهی برای دانلود یک فایل چندین درخواست ارسال می کنند.

در خصوص امنیت:
چون کدهای شما رو کامل نمی بینم، فرض کنید من آدرس یک فایل رو بدم به جای آدرسی که در صفحه هست، چه اتفاقی می افته؟
مثلا فرض کنید من به جای نام فایل بنویسم: web.config اونوقت چه اتفاقی می افته؟ :چشمک:

giaspirit
چهارشنبه 06 فروردین 1393, 18:03 عصر
برنامه های دانلود منیجر متاسفانه این مورد رو دارن، چون اول درخواست می کنند و اطلاعات فایل رو می گیرند، بعد اگر شما تایید کردی، دوباره فایل رو می گیرند. برای همین گاهی برای دانلود یک فایل چندین درخواست ارسال می کنند.

در خصوص امنیت:
چون کدهای شما رو کامل نمی بینم، فرض کنید من آدرس یک فایل رو بدم به جای آدرسی که در صفحه هست، چه اتفاقی می افته؟
مثلا فرض کنید من به جای نام فایل بنویسم: web.config اونوقت چه اتفاقی می افته؟ :چشمک:

بله؛ با توجه به بررسی که کردم متوجه شدم که مشکل از منیجر دانلود هستش و حرف شما کاملا درسته، حالا چاره چیه دوست عزیز؟
در کدی که گذاشتم کاملا مشخص هستش که شما فقط با اسم فایل نمیتونین دانلود کنین همراه اسم، کد فایل هم از بانک اطلاعاتی خوانده میشه و ارسال میشه، فایل web.config با چه کدی و کجای بانک اطلاعاتی ذخیره میشه؟ اگه شما اسم اشتباه یا کد اشتباه بفرستین به خطا میخوره که فک کنم درس و ایمن باشه!:متفکر:

mRizvandi
چهارشنبه 06 فروردین 1393, 19:31 عصر
بله؛ با توجه به بررسی که کردم متوجه شدم که مشکل از منیجر دانلود هستش و حرف شما کاملا درسته، حالا چاره چیه دوست عزیز؟
در کدی که گذاشتم کاملا مشخص هستش که شما فقط با اسم فایل نمیتونین دانلود کنین همراه اسم، کد فایل هم از بانک اطلاعاتی خوانده میشه و ارسال میشه، فایل web.config با چه کدی و کجای بانک اطلاعاتی ذخیره میشه؟ اگه شما اسم اشتباه یا کد اشتباه بفرستین به خطا میخوره که فک کنم درس و ایمن باشه!:متفکر:

چون این موضوع به سمت کلاینت برمیگرده راه حلی نداره، یا حداقل من که راه حلی پیدا نکردم.
در خصوص امنیت هم خیلی خوبه که اطلاعات رو از بانک میگیرید.
اگر بدست آوردن آدرس فایل و بررسی رو با این کلاسی که خودتون نوشتید انجام می دید، همه چی حله (FileInfo(filePath);)