我们创建了一个CMS,它运行良好,但现在我想将移动二进制文件(安装程序)文件下载到CMS。它们目前从另一台服务器流式传输。
我能看到的唯一解决方案是将某些文件夹中的文件索引作为Xml文档,并使用Linq2Xml检索文件并将其传输到移动浏览器。我真的不想为此使用数据库。我正在考虑将下载门户升级到MVC,因为内置功能可以通过指定byte [],filename和mime将文件直接流式传输到浏览器。
有更好的建议吗?
答案 0 :(得分:1)
直接从MVC控制器提供文件非常简单。这是我之前准备的,因为它是:
[RequiresAuthentication]
public ActionResult Download(int clientAreaId, string fileName)
{
CheckRequiredFolderPermissions(clientAreaId);
// Get the folder details for the client area
var db = new DbDataContext();
var clientArea = db.ClientAreas.FirstOrDefault(c => c.ID == clientAreaId);
string decodedFileName = Server.UrlDecode(fileName);
string virtualPath = "~/" + ConfigurationManager.AppSettings["UploadsDirectory"] + "/" + clientArea.Folder + "/" + decodedFileName;
return new DownloadResult { VirtualPath = virtualPath, FileDownloadName = decodedFileName };
}
你可能需要做更多的工作来实际决定要传递什么文件(或者,更有可能做一些完全不同的事情),但我只是将其简化为基础知识,作为一个示例,显示有趣的返回位
DownloadResult是一个自定义的ActionResult:
public class DownloadResult : ActionResult
{
public DownloadResult()
{
}
public DownloadResult(string virtualPath)
{
VirtualPath = virtualPath;
}
public string VirtualPath { get; set; }
public string FileDownloadName { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (!String.IsNullOrEmpty(FileDownloadName))
{
context.HttpContext.Response.AddHeader("Content-type",
"application/force-download");
context.HttpContext.Response.AddHeader("Content-disposition",
"attachment; filename=\"" + FileDownloadName + "\"");
}
string filePath = context.HttpContext.Server.MapPath(VirtualPath);
context.HttpContext.Response.TransmitFile(filePath);
}
}