2011-10-17 33 views
1

我正在ASP.net中编写一个web应用程序。ASP.Net传输文件

我想出现一个文件对话框,用于从服务器下载东西。

我有适当的文件数据存储在一个名为文件的变量。

文件字段: 文件类型 - 文件
文件路径的MIME类型 - 服务器端文件路径

这里是到目前为止的代码:

Response.Clear(); 
Response.ContentType = file.FileType; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 
Response.TransmitFile(file.FilePath) ; 
Response.End(); 

用GetFileName是得到我的函数来自附件对象的文件名。我只存储路径。

上述代码位于名为“Download_Clicked”的函数中,该函数是点击时触发的事件。该事件映射到LinkBut​​ton。

问题是,当我运行上面的代码时,没有任何反应。标准对话框不出现。

我已经尝试了标准的故障排除,例如确保文件存在,并确保路径正确。他们都死了。

我的猜测是,因为我的机器也是服务器,它可能无法正确处理。

在此先感谢。

编辑1:试图将控件放到另一个页面上,工作正常。

编辑2:通过从AJAX更新面板中删除控件解决了问题。

+0

是由IIS知道的MIME类型?你有没有尝试过使用“application/octet-stream”? –

+0

我试过八位字节流的MIME类型,它仍然没有去。 – wanderingloki

+2

Ajax更新面板无法使用FileUpload控件或使用响应下载文件。 MSAjax库内置了安全措施,如果您修改响应流,则会引发错误。下载动态生成文件的常用技术是将文件数据临时存储在会话变量中,然后将用户重定向到页面,该页面专门查看页面加载时的会话变量并将文件发送到浏览器。您也可以通过http处理程序执行此操作,或者将文件上载/下载控件保留在更新面板之外 –

回答

0

请参阅初始文章上的修改。

删除了Ajax更新面板来解决错误。该面板正在停止发回服务器。

欲了解更多信息,请参阅Cris Valenzuela的评论。

0

尝试改变

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  Path.GetFileName(GetFileName(file)))); 

如果不工作,你可以随时使用Response.BinaryWrite或Resonse.Write文件流的网页浏览器 这里如何使用Response.Write或Response.BinaryWrite传输文件。把这些函数库中的某个地方,然后打电话给他们根据需要

public void SendFileToBrowser(String FileName, String MIMEType, String FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.Write(FileData); 
     Response.End(); 
    } 

    public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.BinaryWrite(FileData); 
     Response.End(); 
    } 

然后放到你调用这些函数,像这样

SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream."); 
+0

对不起,那也没有解决它。仍然没有收获。 – wanderingloki

+0

我添加了Response.Write和Response.BinaryWrite方法来传输我尝试使用Response.WriteFile的文件 –

0

使用Response.WriteFile()代替。另外,请不要使用Response.End()!这会中止该线程。使用Response.Flush(); Response.Close();

+0

。不寻常的事情是,我把控制权投到了另一页上,它运行良好。但它不会在我把它放在最初的页面上。 – wanderingloki

+0

'Response.ContentType = file.FileType;' - 内容类型是MIME内容类型,* not *文件类型。您可以谷歌搜索常用内容类型的列表,以匹配您输出到客户端的文件。 检查你的“破损”页面是否没有发送任何头文件 - 一旦这些头文件被发送到客户端,你不能重新发送它们。 – Leon

+0

file.FileType是文件的MIME类型。它只用于输出。这是向客户端发送内容的唯一函数,页面上没有其他内容发送内容。 – wanderingloki

3

我发现另一个没有删除更新面板,这样做。将下面的代码放置在您的页面加载中,您现在可以使用该按钮触发下载。

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);