从MVC5将文件从Web浏览器下载到桌面

时间:2016-09-20 15:21:57

标签: c# asp.net-mvc asp.net-4.5 fileresult

我有一个MVC5项目,它有一个允许用户从SQL Server下载文档的视图。此视图是具有一个或多个文件输入控件的表单页面,允许用户上载任何文件类型。当用户从桌面选择文件并将其放入输入文件框并单击提交按钮时,该文件将转换为byte []类型并保存到SQL Server中。上载文件后,用户再次打开同一页面,下载链接将显示在控件中。如果用户单击该文件,则该文件不会保存到其桌面上,但如果用户右键单击该链接并在新选项卡中将其打开,则可以下载该文件。以下是视图页面中的以下片段,允许用户从上传控件下载文件:

FillTemplateFields.cshtml

@{
     string[] fileUploadItems = @value.Split(',');
 }

@for (int k = 0; k < @fileUploadItems.Length; k++)
{
     <div id="fileContainer-@count">
     @if(fileUploadItems[k] != null){
         <input id="sub-file-@count" type="file" value="@fileUploadItems[k]" placeholder="@control.Placeholder" name="fileUpload-@count" data-sub-channel="sub-input-@count">

         @Ajax.ActionLink("Download " + @fileUploadItems[k], "DownloadFile", new { fieldID = @count, fileName = @fileUploadItems[k] }, null)
         <br />
 }
 else
 {
     <input id="sub-file-@count" type="file" value="" placeholder="@control.Placeholder" name="fileUpload-@count" data-sub-channel="sub-input-@count">
 }

 <a id="deleteControl-@count" href="#">Delete</a>

'fileUploadItems'对象包含保存在上传控件中的文件名。 Ajax.ActionLink帮助程序创建一个链接,该链接调用'DowloadFile'方法,该方法传递fielding的值和文件名,并找到保存到Sql Server上的文件:

TemplateValuesController.cs

public FileResult DownloadFile(int fieldID, string fileName)
    {
        tbl_FileStorage file = db.tbl_FileStorage.Where(f => f.FileName == fileName && f.TemplateFieldValuesID == fieldID).First();
        return File(file.File, System.Net.Mime.MediaTypeNames.Application.Octet, file.FileName);
    }

我可以通过右键单击下载链接并在新选项卡上打开它来成功下载文件,但是我不能在停留在同一页面时下载它,而且我不是要尝试将文件流式传输到新浏览器选项卡。有人可以给我解决方案吗?谢谢。

1 个答案:

答案 0 :(得分:0)

问题已经解决。我通过更改“FillTemplateFields.cshtml”页面中的一行代码来修复它。

更改前

@Ajax.ActionLink("Download " + @fileUploadItems[k], "DownloadFile", new { fieldID = @count, fileName = @fileUploadItems[k] }, null)

变更后

@Html.ActionLink("Download " + @fileUploadItems[k], "DownloadFile", new { fieldID = @count, fileName = @fileUploadItems[k] })

完成更改后,我可以将文件下载到桌面上,同时停留在找到下载链接的页面上,而无需在新标签页中打开链接。