下载文件在ASP mvc .net

问题描述:

我把下载链接在jqgrid中,我的文件存储在服务器上不在数据库中,文件是不同类型的(扩展名) 我想用户应该下载文件时,他点击下载链接下载文件在ASP mvc .net

代码加载的jqGrid是Follws

public object GetJSONFormatProjectDetails(List<ProjectMasterDTO> listProjectDTO, int SkipCount) 
    { 
     var data = (listProjectDTO.Select(c => new 
     { 
      id = c.ProjectID, 
      cell = new[] 
         { 
          c.ProjectName, 
          c.OfficeName, 
          c.ProjectType, 
          c.ProjectNature, 
          c.EntrepreneurName, 
          c.Year + " Years " +c.Month + " Months " + c.Day + " Days" , 
          c.ConcessionWEFdate, 
          c.ProjectStartDate, 
          c.ProjectEndDate, 
          c.isRoadApplicable, 
          (c.FilePath != "NA") ? "<a href='#' style='color:green' onclick='DownLoadFile(\""+URLEncrypt.EncryptParameters(new string[]{ "filepath =" +c.FilePath.Replace("/","$").Replace(" ","#").Trim()})+"\");return false;'>"+(c.FilePath != "NA" ? "DownLoad":"Not Available") + " </a>" : "<span style='color:Red' >Not Available</span>" 

         } 
     })).ToArray().Skip(SkipCount); 
     return data; 
    } 

JS文件的代码如下

function DownLoadFile(param) { 
$.ajax({ 
url: "/Home/GetFile?parameter=" + param, 
    cache: false, 
    type: "POST", 
    async: false 
}); 

}

守则控制器如下现在

public ActionResult GetFile(string parameter) 
    { 
     string queryStringParameters = Request.QueryString["parameter"]; 

     if (queryStringParameters == null) 
     { 
      throw new Exception("Url is tampered"); 
     } 

     string[] parameterArray = queryStringParameters.Split('/'); 

     string param = null; 
     string hash = null; 
     string key = null; 
     if (parameterArray.Length == 3) 
     { 
      param = parameterArray[0]; 
      hash = parameterArray[1]; 
      key = parameterArray[2]; 
     } 
     if (!(string.IsNullOrEmpty(parameter))) 
     { 
      Dictionary<string, string> parameters = URLEncrypt.DecryptParameters(new string[] { param, hash, key }); 
      string FilePath =string.Empty ; 
      parameters.TryGetValue("filepath", out FilePath); 
      FilePath = FilePath.Replace('$','\\'); 

      // DownloadFile(FilePath); 

      string name = Path.GetFileName(FilePath); 
      string ext = Path.GetExtension(FilePath); 
      string type = ""; 
      // set known types based on file extension 
      if (ext != null) 
      { 
       switch (ext.ToLower()) 
       { 

        case ".pdf": 
         type = "Application/pdf"; 
         break; 

        case ".doc": 

        case ".docx": 
         type = "Application/msword"; 
         break; 

        case ".jpg": 

        case ".bmp": 

        case ".tiff": 

        case ".png": 

        case ".gif": 

        case ".jpeg": 
         type = "Application/Image"; 
         break; 
        default: 
         type = "Application"; 
         break; 

       } 
      } 
      Response.AppendHeader("content-disposition", "attachment; filename=" + name); 

      if (type != "") 
      { 
       Response.ContentType = type; 
      } 
      String FullFilePath = @"F:\MHTOLL\ContractUploadDetails\" + name; 
      //return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName); 
      // return File(new FileStream(FullFilePath, FileMode.Open), type, name); 
      return File(FullFilePath, type,name); 

     } 
     return null; 
    } 

不介意关于返回空值和异常处理

还表明显示.gif注意动画下载文件。

我不认为你可以使用AJAX调用来下载文件。

我觉得这个答案会让你得到你想要的。请务必阅读有关下载提示和MIME类型的注释。 Download File Using Javascript/jQuery

我最近遇到同样的问题,并意识到AJAX将无法下载文件。尝试一个ActionLink的,而不是:

@Html.ActionLink("ButtonName", "controllerFunctionName", "controllerName", new { functionParamName = paramValue })

你将包括控制器的功能:

public ActionResult controllerFunctionName(type functionParamName){ // do your download here }

+0

简单地说,AJAX不能很好地与Response.function调用工作。然而,我没有理由说,如果有人能为我解释这一点,我将不胜感激。 – lohiaguitar91 2013-03-27 01:19:37

+0

这里是我最初发布我的问题:http://*.com/questions/15458477/response-writefile-not-working-asp-net-mvc-4-5/15577763#15577763。我使用AJAX,但没有看到这个问题。我认为这个bug是在控制器功能中。 – lohiaguitar91 2013-03-27 01:21:07