尝试从URL返回文件时,不是有效的虚拟路径

时间:2012-04-02 00:11:22

标签: asp.net-mvc-3

我们从CdN下载文件,然后将该下载文件的URL返回给用户。我正在努力实现这一点,以便当用户点击下载按钮时,它会测试该下载文件的URL,然后根据该本地URL强制保存提示。

例如,如果页面上有一个名为download的按钮用于特定的.pdf,我们最终会在我们的控制器中找到cdn并下载文件的代码,压缩它然后返回一个url,例如:{{3 }}

我不确定您是否可以使用File()方法将资源返回给用户,以便在您拥有该文件的URL而不是系统目录虚拟路径时导致保存提示。

那么如何才能使用url?我需要下载按钮最终强制保存提示,给出一个URL,例如上面这个例子生成的内容?不是我使用的是POST,而不是GET,所以不确定在这种情况下我应该使用哪一个,除了这不能用于强制保存提示。它正在击中我的GetFileDownloadUrl,但最终错误称它不是虚拟路径。

这是我的代码:

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

    public ActionResult GetFileDownloadUrl(string fileCdnUrl, int carId, int userId)
    {
        string downloadUrl = string.Empty;

        // take the passed Cdn Url and go and download that file to one of our other servers so the user can download that .zip file
        downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnUrl;

        // now we have that url to the downloaded zip file e.g. http://www.ourLocalAssetServer.com/assets/20120331002728.zip
        int i = downloadUrl.LastIndexOf("/");

        string fileName = downloadUrl.Substring(i);

        return File(downloadUrl, "application/zip", fileName);
    }

错误:不是有效的虚拟路径

1 个答案:

答案 0 :(得分:0)

除了zip文件位于虚拟路径中之外,这不起作用。

您在此处使用的File方法File(string,string,string)需要一个将用于创建FilePathResult的fileName。

另一个选择是下载它(使用WebClient.DownloadData或DownloadFile方法)并传递字节数组或文件路径(取决于您选择的那个)。

var webClient = new Webclient();
byte[] fileData = webClient.DownloadData(downloadUrl);

return File(fileData, "application/zip", fileName);

你得到文件名所以得到“/”索引的行是不必要的,因为你可以使用:

string fileName = System.IO.Path.GetFileName(downloadUrl);