我的应用程序需要在文件缓存后下载文件,然后下载文件。我有一个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
时,无论我使用哪个服务器,它都会输出我的用户名。
UnauthorizedAccessException
?FilePathResult
下载文件。这是真的? ActionResult
以通过Javascript方法开始下载? 更新 UnauthorizedAccessException
异常是由于fileNames
参数为空,因为没有设置路由到映射到名为“fileNames”的参数的方法”。因此,path
构造函数的FilePathResult
参数只是目录名称,如异常消息中所示。
答案 0 :(得分:4)
没有。您不能使用jQuery通过下载返回文件。但是,您可以将location.href
设置为传递文件的操作,它将在不更改当前页面的情况下下载该文件。这假设FileResult是一个附件,它通常是。您应该更改客户端上的方法以使用location.href
而不是jQuery get
。我不确定你为什么会得到访问异常。可能是您访问特定目录时,您的帐户无权访问路径中的其中一个中间目录。