Как я могу написать PDF на страницу asp.net? - PullRequest
0 голосов
/ 02 марта 2011

Я пытаюсь получить страницу в формате 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 работать правильно. Если бы мне нужно было позвонить в PDF напрямую через URL, это было бы http://www.abc.com/reports/sample.pdf, но я не могу вернуться в это место. Я реализовал HTTPHandler, чтобы запретить кому-либо переходить по URL, но теперь мне нужно отправить файл обратно в браузер и записать его.

мысли, комментарии, предложения?

редактирование: Это ПУТЬ, что я не могу получить относительный URL, чтобы указать на правильное местоположение. context.Request.CurrentExecutionFilePath выдает мне «/www.abc.com/sample_reports/sample.pdf», но я просто не могу поверить, что могу открыть / прочитать его

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Что вы подразумеваете под дорожкой?Имя файла?Вы можете сделать это с помощью заголовка Content-Disposition.

Response.Addheader "Content-Disposition", "attachment;Filename=WhateverName.pdf"
1 голос
/ 02 марта 2011

Вы должны открыть его с локального сервера.Если он находится на вашем сервере, вы можете сделать

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

Если вы хотите загрузить его с URL-адреса, сначала нужно загрузить 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 ();` 
0 голосов
/ 02 марта 2011

Я бы изменил несколько вещей

Сначала я мог бы рассмотреть возможность переключения чтения файла на что-то более простое, если это файл на диске

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();

Является ли приведенный выше код избыточным?Возможно, но я обнаружил, что все браузеры, работающие вокруг overkill, того стоят.

...