Невозможно открыть диалог сохранения загрузки - PullRequest
2 голосов
/ 24 декабря 2010

Используя приведенный ниже код, я не могу показать диалоговое окно открытия / сохранения в виде файла:

        public void ProcessRequest(HttpContext context)
        {
            string link = context.Request.QueryString["Link"];
            string extension = Path.GetExtension(link);
            string fileName = Path.GetFileName(link);
            string fullPath = 
                 String.Format("{0}\\{1}",
                     context.Server.MapPath("~/Content/Uploads/"), 
                     fileName);

            if (File.Exists(fullPath))
            {
                context.Response.ClearContent();
                context.Response.ClearHeaders();
                context.Response.AddHeader(
                    "Content-Length", 
                    new FileInfo(fullPath).Length.ToString());
                string contentType;
                switch (extension)
                {
                    default:
                        contentType = "application/octet-stream";
                        break;
                }
                context.Response.ContentType = contentType;
                context.Response.AddHeader(
                    "Content-Disposition", 
                    String.Format("attachment; filename={0}", fileName));
                context.Response.WriteFile(fullPath, true);
                context.Response.Flush();       
            }
        }

Я пытался закрыть ответ, оставить ответ открытым, использовать TrasmitFile(), но яникогда не получайте никакого диалога или какой-либо обратной связи вообще.Я также попытался отладить его, но никаких исключений не выдается.Пробовал в IE 7/8 и Chrome.Любая помощь приветствуется.

Спасибо!

Ниже представлен вывод Fiddler:

HTTP / 1.1 200 OK Cache-Control: private Content-Length: 3813 Content-Тип: application / octet-stream Сервер: Microsoft-IIS / 7.5 Content-Disposition: вложение;filename = b1af9b34-28cc-4479-a056-8c55b41a5ece.txt X-AspNet-версия: 4.0.30319 X-Powered-By: ASP.NET Дата: чт, 23 декабря 2010 21:51:58 GMT

* Home
* Hotels
* Reviews
* Community
* Travel Guide
* Travel Insurance
* Contact us

* FIDDLER: RawDisplay урезан до 128 символов.Щелкните правой кнопкой мыши, чтобы отключить усечение.*

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

Наконец-то разобрался.На самом деле нет проблем с кодом, который я разместил.Как видно из вывода Fiddler, содержимое текстового файла было успешно записано в поток ответов, и используемые заголовки также были правильными.Фактическая проблема возникает из-за того, как был сделан фактический http-запрос.Я использовал

$. Get (urlToGenericHandler);

запрос с использованием jQuery.Причина, по которой я не могу загрузить файл с помощью AJAX или модели обратного вызова, выходит за рамки этого ответа.См. Поддерживаемые типы данных jQuery здесь

В любом случае я изменил вызов с использования AJAX на использование базового постбека.

Спасибо всем, кто помог.

2 голосов
/ 24 декабря 2010

Попробуйте изменить

contentType = "application/octet-stream";

на

contentType = "application/download";

Обновление : Попробуйте поменять местами позицию заголовка и тип содержимого

context.Response.AddHeader(
    "Content-Disposition", 
    String.Format("attachment; filename={0}", fileName));
context.Response.ContentType = contentType;
context.Response.AddHeader(
    "Content-Length", 
    new FileInfo(fullPath).Length.ToString());
...