Pages

Thursday, October 10, 2013

Control file download using a HttpHandler - without exposing the files location

This will show you how to make a HttpHandler which can retrieve files without exposing the files location.
You can add additional logic such as download count or access restriction.

First things first, you'll need to setup your HttpHandler, I've called mine GetFile.cs:
namespace Sample.HttpHandlers
{
    public class GetFile : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            // The logic goes here
        }
    }
}
Remember to add the handler in your web.config, additional information can be found at microsoft support.
<add name="GetFile" verb="*" path="GetFile.axd" type="Sample.HttpHandlers.GetFile"/>

I've created a very simple table to store the file information:
key (uniqueidentifier) - In this case a guid
path (string) - This is the path to the file

Insert this logic into the ProcessRequest:
// Parse the query name "key" to a guid
Guid fileKey;
if (Guid.TryParse(context.Request.QueryString["key"], out fileKey))
{
    // Find the row corresponding with the guid from the database
    FileItem fileItem = new FileService().LoadFiles.FirstOrDefault(x => x.FileKey == fileKey);
    if (fileItem != null)
    {
        // TODO: Add additional logic here, such as download count or access restriction

        // Adds a root directory to the path giving you the 
        // ability to move the files without renaming all the path's in the database
        string filePath = string.Format("{0}{1}", @"D:\Files", fileItem.Path);
        if (File.Exists(filePath))
        {
            // Clears the buffer
            context.Response.ClearContent();
            context.Response.ClearHeaders();
            // The header will tell the browser that the file is an attachment, 
            // this will prompt to download instead of displaying the file in the browser
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileItem.Name);
            // Extracting the ContentType from the file extention 
            // using the MimeMapping method which has been made public in FW 4.5
            context.Response.ContentType = MimeMapping.GetMimeMapping(fileItem.Name);
            context.Response.BufferOutput = false;
            // Transmits the file
            context.Response.TransmitFile(filePath);
            context.Response.End();
        }
        else
            context.Response.Write("The file do not exist in the directory");
    }
    else
        context.Response.Write("The file do not exist in the database");
}
else
    context.Response.Write("Missing key");

To retrieve a file you need to call: /GetFile.axd?key=[your identifier] within your application

Additional information on the MimeMapping introduced in FW 4.5 can be found msdn and msdn blogpost.

If your on an earlier version than 4.5 I can suggest using this method:
private string GetContentType(string fileName)
{
    string contentType = "application/octetstream";
    string ext = System.IO.Path.GetExtension(fileName).ToLower();
    Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (registryKey != null && registryKey.GetValue("Content Type") != null)
        contentType = registryKey.GetValue("Content Type").ToString();
    return contentType;
}

13 comments:

  1. đồng tâm
    game mu
    cho thuê nhà trọ
    cho thuê phòng trọ
    nhac san cuc manh
    số điện thoại tư vấn pháp luật miễn phí
    văn phòng luật
    tổng đài tư vấn pháp luật
    dịch vụ thành lập công ty trọn gói
    lý thuyết trò chơi trong kinh tế học
    đức phật và nàng audio
    hồ sơ mật dinh độc lập audio
    đừng hoang tưởng về biển lớn ebook
    chiến thắng trò chơi cuộc sống ebook
    bước nhảy lượng tử
    ngồi khóc trên cây audio
    truy tìm ký ức audio
    mặt dày tâm đen audio
    thế giới như tôi thấy ebook

    Ngay khi Trương Thiên Sư đang lên đường thì….Một đội Cẩm Y Vệ bắt đầu hoàn toàn bị đồ sát.

    Một đạo lãnh quan sắc bén xuất hiện tại thân thượng của một tên Cẩm Y Vệ phiên tử.
    Một gã đi bên cạnh chỉ thấy trên mặt đột nhiên nóng lên, một tia máu tươi nóng hổi phun tới. Hắn chưa kịp đưa tay lau đi vết máu trên mặt, đã thấy mọi người bên cạnh mình ngã xuống chết. Trên ngực đều có một nhát kiếm.

    Một kiếm mất mạng!

    Phiên tử thủ lĩnh bất giác kinh hãi. Kiếm pháp như vậy thực sự bá đạo. Trong chớp mắt có thể sát hại hơn mười huynh đệ của hắn mà không gây ra một chút tiếng động.

    Cảm nhận được sát khí từ phía sau truyền đến. Phiên tử thủ lĩnh quay đầu lại, đã thấy một thanh kiếm có hình dáng kỳ lạ đang chỉ vào mình.

    Sử dụng quái kiếm này là một mông diện nữ tử( nữ tử che mặt). Mặc dù không nhìn thấy mặt của nàng nhưng gã phiên tử cũng đoán được đây hẳn phải là một tuyệt sắc nữ tử.

    Phiên tử liếc mắt nhìn nàng một cái, tâm thần tự nhiên chấn động. Đây chính là cảm giác trước khi chết người ta thường gặp phải.

    Nữ tử tóc dài phi tán trong gió đêm tung bay phấp phới. Con ngươi xinh đẹp lóe lên quang thiểm xinh đẹp nhưng lạnh lùng phảng phất như đến từ thế giới khác vậy.

    “Là tiên tử hay ác ma?”

    Ngay lúc này thì quái kiếm chợt rung lên.

    Kiếm thế vung ra, phiên tử thủ lĩnh nhất thời cảm thấy áp lực đè nặng lên, trong phút chốc toàn thân hắn đã chìm trong kiếm quang của đối phương.

    ReplyDelete
  2. Designed according to CCSP-ISC2 Certification Exam, IgmGuru’s CCSP Training Online is a god one to go for! This helps to make sure that the candidate passes the exam in the first attempt.

    ReplyDelete
  3. Designed according to CCSP Certification Exam, IgmGuru’s CCSP Training Online is a god one to go for! This helps to make sure that the candidate passes the exam in the first attempt. Cloud security framework, applications, design, and functions are the few areas within what you will be gaining mastery in with the help of CCSP Course Online.

    ReplyDelete
  4. Designed according to CCSP-ISC2 Certification Exam, IgmGuru’s CCSP Training Online is a god one to go for! This helps to make sure that the candidate passes the exam in the first attempt. Cloud security framework, applications, design, and functions are the few areas within what you will be gaining mastery in with the help of ccsp online training. Gaining CCSP isc2 accreditation can be substituted for the whole CCSP encounter necessity.

    ReplyDelete
  5. Cloud security framework, applications, design, and functions are the few areas within what you will be gaining mastery in with the help of ccsp course online.

    ReplyDelete
  6. 1. Coventry health insurance: It pays to look through your health insurance policy at least once a year or as often as you think changes have occurred in your health or that of your family member. Even if this does not lead to savings, it will ensure you always have adequate health insurance. more info

    ReplyDelete
  7. Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info. parental control apps

    ReplyDelete