Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Serve up file from outside web application directory

71 views
Skip to first unread message

Brian Simmons

unread,
Aug 16, 2007, 11:20:27 AM8/16/07
to
I come from a ColdFusion background, and CF has the ability (via something
called CFCONTENT) which allows you to serve up a file which resides outside
your web root directory.

How do I accomplish a similar thing using ASP.net 2 (C#)?

Basically, my web app is creating a PDF document and storing it in C:\PDFS

In my app, I want to have a LinkButton which will serve up the PDF (located
in C:\PDFS) to the user.
I DO NOT want to have the PDFs in the web app's directory structure because
you have to log into the app to use it. And I don't want just anyone to be
able to link to the PDF.

Thanks in advance for any advice,
Brian


Mike

unread,
Aug 16, 2007, 11:30:06 AM8/16/07
to
Cold Fusion, ha good times there.

In C# you would use something like

DirectoryInfo dir = new DirectoryInfo("c:\\pdfFiles);
FileInfo[] pdfFiles= dir.GetFiles("*.pdf");
foreach(FileInfo f in pdfFiles)
{
Response.Write("<br><a href=" + f.Name + ">" + f.Name + "</a>");
}

"Brian Simmons" <cent...@newsgroup.nospam> wrote in message
news:%23c5n%23jB4H...@TK2MSFTNGP05.phx.gbl...

Aidy

unread,
Aug 16, 2007, 11:55:23 AM8/16/07
to
http://support.microsoft.com/kb/306654

Rather than using MapPath, just supply the actual directory.

"Brian Simmons" <cent...@newsgroup.nospam> wrote in message
news:%23c5n%23jB4H...@TK2MSFTNGP05.phx.gbl...

Aidy

unread,
Aug 16, 2007, 11:56:22 AM8/16/07
to
Also ignore the "Add the PDF File to the Project" section :) As you want
the file outside your web space

"Aidy" <ai...@xxnoemailxx.com> wrote in message
news:iKGdnaUWU_Dw7lnb...@bt.com...

Steven Cheng[MSFT]

unread,
Aug 16, 2007, 10:42:19 PM8/16/07
to
Hi Brian,

This is a piece of cake in ASP.NET since you can utlize the powerful
functionality of .net framework components. As other members have
suggested, you can use the System.IO classes to get binary data from the
external file system (even on remote share folder) and write it out to
page's response stream. e.g.

======================
protected void Page_Load(object sender, EventArgs e)
{
byte[] bytes = null;
string path = @"d:\filestore\pdf_files\test.pdf";

bytes = File.ReadAllBytes(path);

Response.ClearHeaders();
Response.ClearContent();
Response.ContentType= "application\pdf";
Response.AddHeader("Content-disposition", "attachment;
filename=test.pdf");

Response.Write(bytes);
Response.End();
}
===========

Here is a web article also mentioned this:

#Secure File Download Page
http://www.codeproject.com/aspnet/SecureFileDownload.asp

In addition, you can even get the file content from other storage such as
database, webservice ..... It's quite flexible when you use the .net
frameowork classes to deal with the things:)

Hope this also helps.

Sincerely,

Steven Cheng

Microsoft MSDN Online Support Lead


This posting is provided "AS IS" with no warranties, and confers no rights.

Steven Cheng[MSFT]

unread,
Aug 21, 2007, 4:45:28 AM8/21/07
to
Hi Brain,

Any further questions on this? If so, please feel free to post here.

Brian Simmons

unread,
Aug 23, 2007, 2:46:25 PM8/23/07
to
Hi Steven (and others),

I'm sure I'm doing something simple wrong.

As a test in my application, I decided to use a simple text file.
so
string path = "C:\sometext.txt" // which exists, and has some text in it,
just a few characters

and I changed the ContentType to:
Response.ContentType = "text/plain";

and I adjusted the filename to sometext.txt instead of test.pdf

When I run it, I'm presented with a text file that says:
System.Byte[]

When I debug it, I can see that bytes[] contains the correct ASCII code for
the simple text I have in there.

Why does the text file presented to me have:
System.Byte[]
in it rather than the simple text which is in the sometext.txt?

Thanks,
Brian


"Steven Cheng[MSFT]" <stc...@online.microsoft.com> wrote in message
news:F5HBEhH4...@TK2MSFTNGHUB02.phx.gbl...

Steven Cheng[MSFT]

unread,
Aug 23, 2007, 10:21:07 PM8/23/07
to
Thanks for your followup Brian,

for the text file with "System.Byte[]" problem you mentioned, do you mean
the file download dialog display the filename as "System.Byte[]"?

If this is the case, I suggest you check the code to see whether you have
add the "Content-Disposition" header and supply the filename. Because when
you stream out a file(or other binary content), the ASP.Net won't care
what's their original filename, you need to explicitly supply them.e.g.

======================
protected void Page_Load(object sender, EventArgs e)
{
byte[] bytes = null;
string path = @"d:\filestore\pdf_files\test.pdf";

bytes = File.ReadAllBytes(path);

Response.ClearHeaders();
Response.ClearContent();
Response.ContentType= "text/plain";

//here put the filename
Response.AddHeader("Content-disposition", "attachment;
filename=test.txt");

Response.Write(bytes);
Response.End();
}
===========

Brian Simmons

unread,
Aug 24, 2007, 9:48:41 AM8/24/07
to
Hi Steven,

Here is my exact code from the Page_Load event (sometext.aspx):
byte[] bytes = null;
string path = "C:\\sometext.txt"; // This file exists and has one
sentence in it: The quick brown fox...etc.

bytes = File.ReadAllBytes(path);

Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain";

Response.AddHeader("Content-disposition", "attachment;
filename=sometext.txt");

Response.Write(bytes);
Response.End();

How I'm Calling that sometext.aspx page:
<a href='sometext.aspx' target='_blank'>Some Text</a>

What happens when that link is clicked:
A new browser window is spawned. IE7 displays a dialog:
Do you want to open or save this file?

If you click open, Notepad displays and the text inside Notepad is:
System.Byte[]

If you click save (to your Desktop let's say), the file saves, and it's
contents are:
System.Byte[]

Any ideas?

Thanks,
Brian


"Steven Cheng[MSFT]" <stc...@online.microsoft.com> wrote in message

news:STsz1Vf5...@TK2MSFTNGHUB02.phx.gbl...

Steven Cheng[MSFT]

unread,
Aug 27, 2007, 4:18:55 AM8/27/07
to
Hi Brian,

Thanks for your followup.

I've rechecked the code and it does be a mistake in my code as I used
"Response.Write" to write out the byte[](binary data), this is incorrect. I
should use the "BinaryWrite" method for binary data(byte[] array).
"Response.Write" should be used for string text data.

Here I've pasted two methods both of which can do the work(one write out
binary data and another write out string data), you can have a look and
choose either one as you want:


>>>>>>>>binary approach>>>>>>>>>
protected void BinaryWriteMethod()
{
byte[] bytes = null;
string path = "e:\\temp\\temp.txt"; // This file exists and has

one sentence in it: The quick brown fox...etc.

bytes = System.IO.File.ReadAllBytes(path);

Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain";

Response.ContentEncoding = Encoding.UTF8;


Response.AddHeader("Content-disposition", "attachment;
filename=sometext.txt");

Response.BinaryWrite(bytes);
Response.End();

}

>>>>>>>>>text string approach>>>>>>>>

protected void StringWriteMethod()
{

string path = "e:\\temp\\temp.txt"; // This file exists and

has one sentence in it: The quick brown fox...etc.

StreamReader sr = new StreamReader(path, Encoding.UTF8);

string data = sr.ReadToEnd();

sr.Close();

Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain";

Response.ContentEncoding = Encoding.UTF8;


Response.AddHeader("Content-disposition", "attachment;
filename=sometext.txt");

Response.Write(data);
Response.End();
}
>>>>>>>>>>>>>>>>>>

BTW, for string text approach, you need to make sure the text
encoding(specified in code) matches the text file's text encoding.

Hope this helps. If there is still anything unclear, please don't hesitate
to let me know.

Sincerely,

Steven Cheng

Microsoft MSDN Online Support Lead

This posting is provided "AS IS" with no warranties, and confers no rights.


--------------------
>From: "Brian Simmons" <cent...@newsgroup.nospam>
>References: <#c5n#jB4HH...@TK2MSFTNGP05.phx.gbl>
<iKGdnaUWU_Dw7lnb...@bt.com>
<t-udnbOodYIv7lnb...@bt.com>
<F5HBEhH4...@TK2MSFTNGHUB02.phx.gbl>
<OBnTnXb5...@TK2MSFTNGP04.phx.gbl>
<STsz1Vf5...@TK2MSFTNGHUB02.phx.gbl>
>Subject: Re: Serve up file from outside web application directory
>Date: Fri, 24 Aug 2007 09:48:41 -0400
>Lines: 84
>X-Priority: 3
>X-MSMail-Priority: Normal
>X-Newsreader: Microsoft Outlook Express 6.00.2900.3138
>X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3138
>X-RFC2646: Format=Flowed; Original
>Message-ID: <#MGOOWl5...@TK2MSFTNGP05.phx.gbl>
>Newsgroups: microsoft.public.dotnet.framework.aspnet
>NNTP-Posting-Host: 65.124.198.22
>Path: TK2MSFTNGHUB02.phx.gbl!TK2MSFTNGP01.phx.gbl!TK2MSFTNGP05.phx.gbl
>Xref: TK2MSFTNGHUB02.phx.gbl microsoft.public.dotnet.framework.aspnet:39662
>X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet

Steven Cheng[MSFT]

unread,
Aug 29, 2007, 10:42:54 PM8/29/07
to
Hi Brian,

Any progress on this or does the further info in my last reply still helps
some? If you have any further questions on this, please don't hesitate to
let me know.

Sincerely,

Steven Cheng

Microsoft MSDN Online Support Lead

This posting is provided "AS IS" with no warranties, and confers no rights.


--------------------

>References: <#c5n#jB4HH...@TK2MSFTNGP05.phx.gbl>

<iKGdnaUWU_Dw7lnb...@bt.com>
<t-udnbOodYIv7lnb...@bt.com>
<F5HBEhH4...@TK2MSFTNGHUB02.phx.gbl>
<OBnTnXb5...@TK2MSFTNGP04.phx.gbl>
<STsz1Vf5...@TK2MSFTNGHUB02.phx.gbl>

<#MGOOWl5...@TK2MSFTNGP05.phx.gbl>

Brian Simmons

unread,
Aug 31, 2007, 10:36:47 AM8/31/07
to
Yes, thanks for the follow-up, your corrections solved the issue. Works
like a charm now.

"Steven Cheng[MSFT]" <stc...@online.microsoft.com> wrote in message

news:MA8dF%23q6HH...@TK2MSFTNGHUB02.phx.gbl...

0 new messages