如何调用save作为返回文件路径的提示

时间:2012-03-31 05:35:26

标签: asp.net-mvc-3

我之前没有对此进行过编码,但我的视图中有一个文件名列表。他们旁边有一个下载按钮。例如:

enter image description here

这是视图标记:

@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"

我不确定如何调用另存为提示,并将用户保持在他们已经在的相同视图中,或者将用户重定向到列出要下载的文件的同一视图...

我想要发生的是:

  1. 用户点击下载按钮
  2. Action Method完成它的事情,在后端下载文件
  3. 用户在点击下载按钮
  4. 后立即无法获得弹出窗口保存

    这可能是常规的,但我以前从未这样做过。我需要帮助弄清楚如何在我的动作方法获取.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);

2 个答案:

答案 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");