我在ASP.NET MVC中将存储在数据库中的文件发送回用户时遇到问题.我想要的是一个列出两个链接的视图,一个用于查看文件并让发送给浏览器的mimetype确定应该如何处理,另一个用于强制下载.
如果我选择查看调用的文件SomeRandomFile.bak并且浏览器没有关联的程序来打开这种类型的文件,那么我没有问题,它默认为下载行为.但是,如果我选择查看调用的文件,SomeRandomFile.pdf或者SomeRandomFile.jpg我希望文件只是打开.但是我也希望将下载链接保留在一边,这样无论文件类型如何,我都可以强制下载提示.这有意义吗?
我已经尝试过FileStreamResult它适用于大多数文件,它的构造函数默认不接受文件名,因此根据url(根据内容类型不知道要提供的扩展名)为未知文件分配文件名.如果我通过指定强制文件名,我将失去浏览器直接打开文件的能力,我得到一个下载提示.有人遇到过这种情况么.
这些是我迄今为止尝试过的例子.
//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
Run Code Online (Sandbox Code Playgroud)
//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
Run Code Online (Sandbox Code Playgroud)
//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
Run Code Online (Sandbox Code Playgroud)
有什么建议?
在WebForms中,我通常会有这样的代码让浏览器显示一个"下载文件"弹出窗口,其中包含任意文件类型,如PDF和文件名:
Response.Clear()
Response.ClearHeaders()
''# Send the file to the output stream
Response.Buffer = True
Response.AddHeader("Content-Length", pdfData.Length.ToString())
Response.AddHeader("Content-Disposition", "attachment; filename= " & Server.HtmlEncode(filename))
''# Set the output stream to the correct content type (PDF).
Response.ContentType = "application/pdf"
''# Output the file
Response.BinaryWrite(pdfData)
''# Flushing the Response to display the serialized data
''# to the client browser.
Response.Flush()
Response.End()
Run Code Online (Sandbox Code Playgroud)
如何在ASP.NET MVC中完成相同的任务?
我使用IIS 7.5在Windows 7 64位上运行C#ASP.NET 4.5 Web应用程序.它使用的应用程序池名为"ASP.NET v4.0",其标识为ApplicationPoolIdentity.该应用程序使用MS Office Interop(Microsoft Excel 14.0对象库).
在行wBook = wBooks.Add(Missing.Value);,它会引发以下错误:
由于没有足够的可用内存或磁盘空间,Microsoft Excel无法打开或保存更多文档.
u2022要提供更多可用内存,请关闭不再需要的工作簿或程序.
u2022要释放磁盘空间,请从您要保存的磁盘中删除不再需要的文件:Microsoft.Office.Interop.Excel.Workbooks.Add(Object Template)
1)我在DCOM配置中的MS Excel应用程序上给了帐户IIS apppool\ASP.NET v4.0完全控制.
2)我在'C:\ Windows\SysWOW64\config\systemprofile'上给了IIS apppool\ASP.NET v4.0完全控制,并在其中创建了一个Desktop文件夹.
3)我需要继续使用Interop,虽然不建议这样做.
4)该应用程序在Windows Server 2003/Windows XP 32位上正常工作.
5)计算机上安装了MS Office 2010(64位,试用版).
6)我不想改变应用程序.从ApplicationPoolIdentity到网络服务等的池标识.ApplicationPoolIdentity是IIS 7中新的标识类型,建议使用它.
如果我在DCOM配置中选择"交互式用户"(我已经以管理员身份登录),它可以正常工作,但它会导致其他问题.我需要使用"启动用户",这是ASP.NET v4.0.所以看起来这是一个许可问题.
请帮忙.谢谢.
iis-7 office-interop excel-interop asp.net-4.0 windows-7-x64