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;
}

1 comment:

  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