我之前没有对此进行过编码,但我的视图中有一个文件名列表。他们旁边有一个下载按钮。例如:
这是视图标记:
@foreach (CarFileContent fileContent in ModelCarFiles)
{
using (Html.BeginForm("GetFileDownloadUrl", "Car", FormMethod.Get, new { carId = Model.CarId, userId = Model.UserId, @fileCdnUrl = fileContent.CdnUrl }))
{
@Html.Hidden("userId", Model.UserId);
@Html.Hidden("carId", Model.CarId);
@Html.Hidden("fileCdnUrl", fileContent.CdnUrl);
<p><input type="submit" name="SubmitCommand" value="download" /> @fileContent.Name</p>
}
}
点击后,我将CdN网址发送到我的操作方法,然后在引擎盖上下载并从Rackspace下载该文件,然后将其复制到我们的服务器供用户下载。所以我的action方法将url返回给用户现在可以下载的.zip文件。但是,当我测试它时,它会回发并重定向到一个空白页面,该页面显示在页面上以文本呈现的URL,就是这样!
"http://www.ourAssetServer.com/assets/20120331002728.zip"
我不确定如何调用另存为提示,并将用户保持在他们已经在的相同视图中,或者将用户重定向到列出要下载的文件的同一视图...
我想要发生的是:
这可能是常规的,但我以前从未这样做过。我需要帮助弄清楚如何在我的动作方法获取.zip的最终下载URL之后如何将保存显示为提示以及如何处理返回到我的视图...我在操作中如何处理该url方法...将其返回到视图?在这里不确定。
这是行动方法:
[HttpGet]
public string GetFileDownloadUrl(string fileCdnUrl int carId, int userId)
{
string downloadUrl = string.Empty;
downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnUrl);
return downloadUrl;
}
我的操作方法中返回的downloadUrl 是“ http://www.ourAssetServer.com/assets/20120331002728.zip ”字符串,例如发回给用户...我只需要弄清楚如何把这个连接到一个保存为提示,但也弄清楚如何处理视图...我重定向回相同的视图或什么? 的更新:
在研究了一下之后,这就是我想出的:
[HttpGet]
public FilePathResult GetFileDownloadUrl(string fileCdnUrl, int carId, int userId)
{
string downloadUrl = string.Empty;
downloadUrl = rackSpaceTask.GetFileZipDownloadUrl(carId, userId, fileCdnUrl);
int i = downloadUrl.LastIndexOf("/");
string fileName = downloadUrl.Substring(i);
return File(downloadUrl, "application/zip", fileName);
}
我收到错误'http://ourAssetServer.com/assets/20120331002728.zip'; is not a valid virtual path
更新#2
这是我最近尝试使用重定向方法尝试获取要显示的保存提示。发生了什么事情是它击中了我的GetFileDownloadUrl,但似乎从来没有达到我的Redirect操作方法,我最终被重定向到一个完全空白的页面(全白),其网址为http://localhost/Car/GetFileDownloadUrl并且只是停在那里
@foreach (CarContent fileContent in Model.CarFiles)
{
using (Html.BeginForm("GetFileDownloadUrl", "Car", FormMethod.Post, new { carId = Model.CarId, userId = Model.UserId, @fileCdnUrl = fileContent.FileCdnUrl }))
{
@Html.Hidden("userId", Model.UserId);
@Html.Hidden("carId", Model.CarId);
@Html.Hidden("fileCdnUrl", fileContent.FileCdnUrl);
<p><input type="submit" name="SubmitCommand" value="download" /> @fileContent.Name</p>
}
}
public void GetFileDownloadUrl(string fileCdnUrl, int carId, int userId)
{
string cownloadUrl = string.Empty;
cownloadUrl = GetFileDownloadUrl(carId, userId, fileCdnUrl);
RedirectToAction("RedirectToUrl", downloadUrl);
}
public ActionResult RedirectToUrl(string fileUrl)
{
Response.Redirect(fileUrl);
return null;
}
我不确定RedirectToUrl应该如何编码...返回类型,如果有的话你会返回什么?它应该只是重定向让我保持在我所在的页面上吗?我不“想”这甚至被击中,只是我的第一种方法。我在Response.Redirect上放了一个调试点,它从来没有命中..只是RedirectToAction上的一个调试点(“RedirectToUrl”,downloadUrl);
答案 0 :(得分:1)
您需要返回FileResult
而不是string
。
return File(path + fileName, "application/zip", "20120331002728.zip");
答案 1 :(得分:0)
考虑定义一个新的动作“RedirectToUrl”,它将url作为参数,然后在代码中使用RedirectToAction:
public ActionResult GetFileDownloadUrl(string fileCdnPath int carId, int userId)
{
string downloadUrl = string.Empty;
downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnPath);
return RedirectToAction("RedirectToUrl",
new { url = downloadUrl });
}
更新:将FilePathResult与Server.MapPath一起使用是另一种选择(假设您下载文件的服务器与运行ASP.NET MVC代码的服务器相同)。在上一次编辑中将以下内容添加到函数的底部:
var assetsPath = Server.MapPath("~/assets");
var localPath = Path.Combine(assetsPath, zipFileName );
return this.File(localPath, "application/zip");