0

我有一个 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”方法的链接,该方法传递字段的值和文件名,并找到保存到 Sql Server 上的文件:

模板值控制器.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);
    }

我可以通过右键单击下载链接并在新选项卡上打开它来成功下载文件,但是在同一页面上时我无法下载它,而且我没有尝试在新的浏览器选项卡上流式传输文件. 有人可以给我解决我想要的东西吗?谢谢你。

4

1 回答 1

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] })

进行更改后,我可以将文件下载到桌面上,同时停留在找到下载链接的页面上,而不必在新选项卡中打开链接。

于 2016-09-21T14:15:52.237 回答