我怎样才能将PDF写入asp.net页面?

时间:2011-03-01 22:37:41

标签: c# asp.net filestream

我正在尝试获取一个PDF页面,该页面位于我的网站上下文中,以便在用户指定时显示。我有以下代码:

    if (context.User.Identity.IsAuthenticated)
    {
        string SampleURL = context.Request.CurrentExecutionFilePath; //CurrentExecutionFilePath;

        context.Response.Buffer = true;
        context.Response.Clear();
        using (FileStream fs = new FileStream(SampleURL,FileMode.Open)) //System.IO.File.OpenRead(path))
        {
            int length = (int)fs.Length;
            byte[] buffer;

            using (BinaryReader br = new BinaryReader(fs))
            {
                buffer = br.ReadBytes(length);
            }

            context.Response.Clear();
            context.Response.Buffer = true;
            context.Response.ContentType = "application/pdf";
            context.Response.BinaryWrite(buffer);
            context.Response.End();
        }
    }
    else
    {
        context.Response.Redirect(
           "~/Error/invalid_access.aspx");
    }

唯一的问题是我无法让PATH正常工作。 如果我直接通过URL调用PDF,那么它将是http://www.abc.com/reports/sample.pdf,但我不能让自己回到那个位置。 我实现了一个HTTPHandler来阻止某人访问该URL,但现在我需要将该文件流回浏览器并进行编写。

想法,意见,建议?

编辑: 它的路径,我无法得到相对网址指向正确的位置。 context.Request.CurrentExecutionFilePath给了我“/www.abc.com/sample_reports/sample.pdf”,但我似乎无法扭转它,以便能够打开/读取它

3 个答案:

答案 0 :(得分:2)

路径是什么意思?文件名?您可以使用Content-Disposition标题执行此操作。

Response.Addheader "Content-Disposition", "attachment;Filename=WhateverName.pdf"

答案 1 :(得分:1)

您必须从本地服务器打开它。如果它位于您的服务器上,您可以执行

FileStream fs = new FileStream(Server.MapPath("/example.pdf"),FileMode.Open)

如果您想从网址加载,您必须先下载PDF。

   WebClient client = new WebClient ();

    // Add a user agent header in case the 
    // requested URI contains a query.

    client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

    Stream data = client.OpenRead (args[0]);
    StreamReader reader = new StreamReader (data);
    string s = reader.ReadToEnd ();` 

答案 2 :(得分:0)

我会改变一些事情

首先,我可能会考虑将文件读取更容易,如果它是磁盘上的文件

byte[] buffer = File.ReadAllBytes( path );

现在用于上下文

context.Response.Clear();
context.Response.ClearHeaders();
context.Response.Buffer = true;
context.Response.ContentType = "application/pdf";
context.Response.AddHeader( "content-disposition","attachment; filename=file.pdf" );
context.Response.AddHeader("Content-Length", buffer .Length.ToString() );
context.Response.BinaryWrite(buffer);
context.Response.Close();
context.Response.End();
context.Response.Flush();

以上代码是否过度杀伤?可能但是我发现所有不同的浏览器都在运行,这是值得的。