Проблема с доставкой PDF-файлов в Google Chrome - PullRequest
0 голосов
/ 06 января 2012

Я написал веб-сервис, используя вызовы в стиле ASMX для обслуживания файлов PDF. Служба обрабатывает данные, отправленные ей как POST-операцию, записывает данные в ответ и отправляет данные обратно после добавления нового типа mime в заголовки.

Файлы PDF создаются на стороне клиента в приложении Flex с использованием AlivePDF.

Некоторое время он работал нормально, но недавно он начал работать с ошибками в Google Chrome - вместо открытия PDF-файла в новом окне или в программе просмотра PDF (в зависимости от конфигурации браузера) Chrome просто отображает пустую страницу. *

Есть ли причина, по которой этот код не может открыть PDF, если ему были переданы действительные данные PDF во входном потоке?

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class Print : System.Web.Services.WebService
{


    [WebMethod]
    public string PrintPDF()
    {
        HttpRequest request = HttpContext.Current.Request;
        HttpResponse response = HttpContext.Current.Response;
        string requestMethod = request.Params["method"];
        string requestFilename = request.Params["name"];

        if(!validateRequest(request))
        {
            throw new ArgumentException(String.Format("Error downloading file named '{0}' using disposition '{1}'", requestFilename, requestMethod));
        }
        response.AddHeader("Content-Disposition", "attachment; filename=\"" + requestFilename + "\"");
        byte[] pdf = new byte[request.InputStream.Length];
        request.InputStream.Read(pdf, 0, (int)request.InputStream.Length);
        response.ContentType = "application/pdf";
        response.OutputStream.Write(pdf, 0, (int)request.InputStream.Length);
        response.Flush();
        response.End();
        return "Fail";
    }

    private bool validateRequest(HttpRequest request)
    {
        string requestMethod = request.Params["method"];
        string requestFilename = request.Params["name"];

        Regex cleanFileName = new Regex("[a-zA-Z0-9\\._-]{1, 255}\\.[a-zA-Z0-9]{1, 3}");
        return (requestMethod == "attachment" || requestMethod == "inline") &&
               cleanFileName.Match(requestFilename) != null;
    }
}

1 Ответ

1 голос
/ 04 декабря 2012

Это общая проблема с Chrome.Это связано с тем, что доморощенный просмотрщик PDF в Chrome очень требователен.

Хотя это не решает проблему с отображением, вы можете принудительно загрузить файл, исправив проблему с доступностью.

<a href="http://www.domain.com/painful.pdf">Broken</a>
<a href="http://www.domain.com/painful.pdf" download="notsopainful">Works</a>

...