使用ASP.NET MVC,我可以使用jQuery GET和FilePathResult下载文件吗?

时间:2010-05-21 18:42:34

标签: asp.net-mvc jquery

我的应用程序需要在文件缓存后下载文件,然后下载文件。我有一个jQuery.post()缓存该文件,然后在文件成功缓存后调用以下内容:

<script type="text/javascript">
    function startViewingFiles(fileNames) {
        $.get(
            '<%= Url.Action(MvcTemplates.Document.DisplayDownload()) %>',
            { fileName: fileNames[0] },
            function() {
                $('<div class="status fill"><p>Download complete</p></div>')
                    .appendTo('#ViewerContainer')
                    .fadeIn('slow'); 
            }
        );
    }
</script>

这与以下操作进行通信,因为我观察到调用实际上是在VS 2008中进入服务器并且FilePathResult成功退出了该方法:

[HttpGet]
public virtual ActionResult DisplayDownload(string fileName)
{
    var path = _CacheService.GetCachedPath(fileName);
    return new FilePathResult(path, _MimeDictionary.LookupMimeType(fileName));
}

使用Firebug,我看到响应包含一个“500内部服务器错误”,抱怨System.UnauthorizedAccessException: Access to the path 'C:\websites\WebSubscriptionPortal\CacheLocation' is denied.我将VS开发服务器和IIS 7.5中的Web应用程序配置为以完全访问权限的用户身份运行目录,但我总是得到这个错误。当我有视图输出WindowsIdentity.GetCurrent().Name时,无论我使用哪个服务器,它都会输出我的用户名。

  1. 为什么我会收到UnauthorizedAccessException
  2. 显然,我无法使用jQuery使用FilePathResult下载文件。这是真的?
  3. 我是否需要更改客户端上使用的方法或服务器上的ActionResult以通过Javascript方法开始下载?
  4. 更新 UnauthorizedAccessException异常是由于fileNames参数为空,因为没有设置路由到映射到名为“fileNames”的参数的方法”。因此,path构造函数的FilePathResult参数只是目录名称,如异常消息中所示。

1 个答案:

答案 0 :(得分:4)

没有。您不能使用jQuery通过下载返回文件。但是,您可以将location.href设置为传递文件的操作,它将在不更改当前页面的情况下下载该文件。这假设FileResult是一个附件,它通常是。您应该更改客户端上的方法以使用location.href而不是jQuery get。我不确定你为什么会得到访问异常。可能是您访问特定目录时,您的帐户无权访问路径中的其中一个中间目录。