загрузка файла ashx, вызывающая проблему в firefox - PullRequest
1 голос
/ 24 июня 2011

Создана страница Ashx, которая называется как

<a href="AttachmentHandler.ashx?id=2">download</a>

В IE он работает нормально, но в Firefox для некоторых типов файлов (doc / xslx и т. Д.) Он прерывает файл, как изменение размера я пытался использовать параметры кодирования / кодировки, но он не работает

<%@ WebHandler Language="C#" Class="AttachmentHandler" %>

using System;
using System.Web;


public class AttachmentHandler : IHttpHandler, System.Web.SessionState.IReadOnlySessionState{

    public void ProcessRequest(HttpContext context)
    {
        try
        {
            string attachmentId = context.Request["Id"];

            if (!string.IsNullOrEmpty(attachmentId))
            {
                Attachment attachmentEntity = AttachmentProvider.GetById(Convert.ToInt32(attachmentId));
                if (attachmentEntity != null)
                {
                    context.Response.Clear();
                    //context.Response.ClearHeaders();

                    //context.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    //context.Response.Charset = System.Text.Encoding.UTF8.WebName;

                    //context.Response.Cache.SetCacheability(HttpCacheability.NoCache);

                    context.Response.Buffer = false;
                    context.Response.ContentType = attachmentEntity.AttachmentType;
                    context.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + attachmentEntity.Name + "\"");
                    context.Response.BinaryWrite(attachmentEntity.AttachmentFile);
                    context.Response.Flush();
                    context.Response.Close();
                }
            }
            else
            {
                context.Response.Clear();
                context.Response.ClearHeaders();
                context.Response.ContentType = "text/plain";
                context.Response.Write(Resources.GlobalResource.ErrorMessageUnableAttachements);
            }
        }
        catch (Exception ex)
        {
            IQity.Fusion.Utility.LoggingUtility.IQityErrorLogger.HandleException(ex);
            context.Response.Clear();
            context.Response.ClearHeaders();
            context.Response.ContentType = "text/plain";
            context.Response.Write(Resources.GlobalResource.ErrorMessageUnableAttachements);
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

Ответы [ 4 ]

2 голосов
/ 24 июня 2011

Добавить

context.Response.ContentType

в вашем коде и ваша ошибка будет устранена ...

if (attachmentEntity != null)
            {
                context.Response.Clear();
                //context.Response.ClearHeaders();

                //context.Response.ContentEncoding = System.Text.Encoding.UTF8;
                //context.Response.Charset = System.Text.Encoding.UTF8.WebName;

                //context.Response.Cache.SetCacheability(HttpCacheability.NoCache);

                context.Response.Buffer = false;
                context.Response.ContentType = attachmentEntity.AttachmentType;
                context.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + attachmentEntity.Name + "\"");
                context.Response.BinaryWrite(attachmentEntity.AttachmentFile);
                context.Response.Flush();
                context.Response.Close();
            }
0 голосов
/ 24 июня 2011

.docx не application/msword.Это application/vnd.openxmlformats-officedocument.wordprocessingml.document.

Убедитесь, что вы используете правильный тип MIME для файлов .docX и .xslX.

0 голосов
/ 24 июня 2011

В последний раз мне приходилось кодировать что-то похожее:

context.Response.Clear();
context.Response.ContentType = attachmentEntity.AttachmentType;
context.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + attachmentEntity.Name + "\"");
context.Response.BinaryWrite(attachmentEntity.AttachmentFile);
context.Response.End();

и это работает с FF ... возможно .Flush() закрывает поток немного раньше ...

Еще одна вещь, которую я заметил: я использую кусок кода, чтобы сказать, что такое ContentType .. и для Msword я получаю application/unknown, но, похоже, все равно работает нормально.

0 голосов
/ 24 июня 2011

Я не думаю, что вы должны называть это: context.Response.Close();

...