C#/ .Net:将文件返回浏览器?

在这个问题之后,建议我创建一个可以从文件系统返回文件的服务器端文件。 我将如何在c#和.net中执行此操作。 我想我将文件名作为查询字符串传递,这是由页面读取并返回文件。 从编码角度来看,不确定从哪里开始。

您可以使用Response.WriteFile方法发送文件的内容,但这可能会因较大的文件而失败。

注意不要在查询字符串中指定任何文件名,因为用户可以使用它来访问服务器上的任何文件。 最好拥有一个允许每个文件名称的文件数据库,并在查询字符串中查找一个名称,以获取文件名。

我建议以byte []的forms读取文件,然后将其发送出来,并在响应中设置内容类型和内容配置,然后执行response.binarywrite和response.flush:

 Byte[] bytes = null; try { if(!FileExists(_filename)) return null; Byte[fs.Length] bytes // get file contents using(System.IO.FileStream fs = System.IO.File.Open(_file, FileMode.Open, FileAccess.Read)) { fs.Read(bytes, 0, fs.Length); } } catch(Exception ex) { System.Text.ASCIIEncoding oEncoder = new System.Text.ASCIIEncoding(); Byte[] bytes = oEncoder.GetBytes(ex.Message); } Context.Response.Buffer = false; Context.ClearContent(); Context.ClearHeaders(); Context.ContentType = "application/octet-stream"; // Change this type as necessary Context.AddHeader("Content-Length", bytes.Length.ToString()); Context.AddHeader("content-disposition", String.Format("inline; filename={0}", filename)); Context.Response.BinaryResult(bytes); Context.Response.Flush(); 

响应部分需要根据您自己的交付平台进行调整(单独的页面,iframe等)。 例如,您可能不想使用ClearHeaders()。

这个主题提出了我在Web根目录之外提供文件的建议。 它使用缓冲区来降低内存使用率。

您可以使用Response.TransmitFile,它对传输大文件很有用。 在此之后,您应该使用Response.Flush()。 内容类型在这里是zip文件。

 Response.ContentType = "application/zip"; Response.AppendHeader("Content-Disposition", "attachment; filename = D:\Splitted Parts.zip"); Response.TransmitFile(zipFileName); Response.Flush();