2015-11-02 56 views
-2

我正试图在客户机上下载文件。没有客户的知识,我们不会去做。该文件已存储在服务器上。我有文件路径,我已经尝试了下面的方法。但它似乎并不奏效。我正在使用当前版本的Google Chrome。它一直在失败。如何使用C#在客户机上下载文件

try{ 
      string Filpath = ParseRequest.GetFileDetails(fileId); 
      FileInfo file = new FileInfo(Filpath); 
      string fileLength = file.Length.ToString(); 
      string fileName = file.Name; 
      string fullName = file.FullName;     
      if (file.Exists) 
      { 
       Response.ClearContent();      
       Response.ContentType = "application/pdf";     
       Response.AddHeader("Content-Length", fileLength); 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);     
       Response.Write(fullName); 
       Response.Flush(); 
       Response.Close(); 
      }else{ 
       Response.Write("This file does not exist."); 
      } 
     }catch(Exception ex){ 
      XLog.Error(ex); 
     } 

下面是响应我得到的截图: enter image description here

+1

“看起来不起作用”不足以帮助我们帮助您诊断此问题。有抛出异常吗?有没有记录错误?它在其他浏览器中工作吗?你有没有通过设置断点和看代码在做什么来调试? –

+0

你不能通过下载来开车。那味道非常不好。 –

+1

对于PDF,你需要'Response.BinaryWrite()'和'Response.ContentType =“application/octet-stream”;'(或简单的'.WriteFile()') –

回答

1

它看起来像你试图调用文件下载(通过content-dispostion: attachment头)后​​面的AJAX请求。浏览器不允许出于明显的安全原因。因此,只需导航到在服务器上调用下载操作的URL,而不是试图抓取AJAX请求的结果。

window.location = "path/to/downloadaction.aspx/GetFile/?fileId=xxx"; 

您指定将指示浏览器发出请求的头,但不是执行重定向到一个页面的响应时,浏览器会显示文件下载对话框,让你的页面上,其中按钮被点击。

如果您需要POST数据以执行文件下载请求,您可以使用嵌入式 - 不幸的是它们仍然可以解决AJAX文件限制。

编辑亚历克斯K.是正确的意见,以及,你需要将文件的字节加入到通过Response.BinaryWrite(pdfBytes)响应,所以你需要有一个File.ReadAllBytes()地方。

+0

非常感谢!这确实有帮助! – newDevGeek