之前的回答是正确的:添加以下代码行...
Response.AddHeader("Content-Disposition", "inline
...会导致多个 Content-Disposition 标头发送到浏览器。这是因为 FileContentResult
在提供文件名时会在内部应用标头。另一个相当简单的替代方案是创建 FileContentResult
的子类并覆盖其 ExecuteResult()
方法。以下是一个示例,它实例化了 System.Net.Mime.ContentDisposition
类的一个实例(与内部 FileContentResult
实现中使用的相同对象)并将其传递给新类:
public class FileContentResultWithContentDisposition : FileContentResult
{
private const string ContentDispositionHeaderName = "Content-Disposition";
public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
: base(fileContents, contentType)
{
ContentDisposition = contentDisposition;
}
public ContentDisposition ContentDisposition { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName;
var response = context.HttpContext.Response;
response.ContentType = ContentType;
response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString());
WriteFile(response);
}
}
在您的控制器
或基础控制器
中,您可以编写一个简单的帮助程序来实例化FileContentResultWithContentDisposition
,然后从操作方法中调用它,如下所示:
protected virtual FileContentResult File(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
{
var result = new FileContentResultWithContentDisposition(fileContents, contentType, contentDisposition);
return result;
}
public ActionResult Report()
{
var report = ...
return File(report.Data, report.ContentType, new ContentDisposition {
Inline = true,
FileName = report.FileName
});
}
现在,文件将以您选择的文件名发送到浏览器,并带有一个“inline; filename=[filename]”的content-disposition头。希望这可以帮助您!