`
wjm901215
  • 浏览: 154095 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Asp.net直接保存文件到客户端

阅读更多

在我们的系统的编写过程中,应该有很多的时候需要客户下载文件.我第一次的做法(应该也是大部分人的做法吧?)是:

1 HttpResponse response = HttpContext.Current.Response;
2 string js = "<script language=javascript>window.open('{0}');</script>";
3 js = string.Format(js, url);
4 response.Write(js);
5

  但是有个问题了,就是会被广告拦截软件直接拦截掉,另我非常的头痛,于是寻找更好的解决方法.看了用Response.BinaryWrite写文件流一文之后觉得确实可以如此,修改代码如下:

1/**//**//**////<summary>
2/**////下载文件
3/**////</summary>
4/**////<paramname="filename">文件物理地址</param>
5
6
protectedvoidDownloadFile(stringfilename)
7...{
8stringsaveFileName="test.xls";
9intintStart=filename.LastIndexOf("\")+1;
10saveFileName=filename.Substring(intStart,filename.Length-intStart);
11FileStreamMyFileStream;
12longFileSize;
13
14MyFileStream=newFileStream(filename,FileMode.Open);
15FileSize=MyFileStream.Length;
16
17byte[]Buffer=newbyte[(int)FileSize];
18MyFileStream.Read(Buffer,0,(int)FileSize);
19MyFileStream.Close();
20
21Response.AddHeader("Content-Disposition","attachment;filename="+saveFileName);
22Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
23Response.ContentType="application/vnd.ms-excel";
24
25Response.BinaryWrite(Buffer);
26Response.Flush();
27Response.Close();
28Response.End();
29
30}


   但是有个严重的问题,就是文件格式。这样只是将流输出,且无法正确识别格式。还好,能人层出不穷, 柚子Nan 提出了能否不考虑文件的类型,直接把文件显示到浏览器(Response) 的想法正好切中我的要害所在,于是急忙研究了柚子Nan的想法,修改出最后代码:

1/**//**//**////<summary>
2/**////下载文件
3/**////</summary>
4/**////<paramname="filename">文件物理地址</param>
5protectedvoidDownloadFile(stringfilename)
6...{
7stringsaveFileName="test.xls";
8intintStart=filename.LastIndexOf("\")+1;
9saveFileName=filename.Substring(intStart,filename.Length-intStart);
10
11Response.Clear();
12Response.Charset="utf-8";
13Response.Buffer=true;
14this.EnableViewState=false;
15Response.ContentEncoding=System.Text.Encoding.UTF8;
16
17Response.AppendHeader("Content-Disposition","attachment;filename="+saveFileName);
18Response.WriteFile(filename);
19Response.Flush();
20Response.Close();
21
22Response.End();
23}


使用昨天Asp.net直接保存文件到客户端 中的方法,经过我的反复测试,各式文档都运行完全正常。于是昨晚修改了现有代码,修改了下载方法,以解决一直困扰自己的窗口拦截问题。

  早上本来还沾沾自喜,这下再也不用老跟客户解释为什么窗口会没掉了。可惜啊,人算不如天算。

  早上客户就反映下载的文件全是乱码。立马在本机进行测试,没问题。再同事的机器上试验,同样没问题。

  那应该是客户端的问题才是。只好让客户NetMeeting演示一下她的操作过程。下载-〉保存-〉打开。这么简单的流程,不会做错吧?

  正在郁闷之际,突然脑光一闪,终于发现不一样的地方,立马试验,果然如此!

  到底有什么区别呢?请看操作图:
客人操作图
我的操作图
各位应该看出不同之处了吧?还看不出来?
这件事情的罪魁祸首就是:

  解决方法:使用lovecherry 的如何从注册表读取文件的ContentType 一文的方法

  修正代码:
1 /**//// <summary>
2 /// 下载文件
3 /// </summary>
4 /// <param name="filename">文件物理地址</param>
5 protected void DownloadFile(string filename)
6 {
7
8 string saveFileName = "test.xls";
9 int intStart = filename.LastIndexOf("\\")+1;
10 saveFileName = filename.Substring(intStart,filename.Length-intStart);
11
12 System.IO.FileInfo fi=new System.IO.FileInfo(filename);
13 string fileextname=fi.Extension;
14 string DEFAULT_CONTENT_TYPE = "application/unknown";
15 RegistryKey regkey,fileextkey;
16 string filecontenttype;
17 try
18 {
19 regkey=Registry.ClassesRoot;
20 fileextkey=regkey.OpenSubKey(fileextname);
21 filecontenttype=fileextkey.GetValue("Content Type",DEFAULT_CONTENT_TYPE).ToString();
22 }
23 catch
24 {
25 filecontenttype=DEFAULT_CONTENT_TYPE;
26 }
27
28
29 Response.Clear();
30 Response.Charset = "utf-8";
31 Response.Buffer= true;
32 this.EnableViewState = false;
33 Response.ContentEncoding = System.Text.Encoding.UTF8;
34
35 Response.AppendHeader("Content-Disposition","attachment;filename=" + saveFileName);
36 Response.ContentType=filecontenttype;
37
38 Response.WriteFile(filename);
39 Response.Flush();
40 Response.Close();
41
42 Response.End();
43 }
44

  最后得出结论:要实现柚子Nan提出的能否不考虑文件的类型,直接把文件显示到浏览器(Response),有一种方法,让客户端都不要隐藏已知的扩展名,但是这种方法是无法适应大部分电脑使用者的(一般只有比较熟悉电脑的人才会这样做吧?)

bbs看中的方法,还没有试用,不知道有没有作用.

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
'在此处放置初始化页的用户代码
' 定义是否是 SQL Server 数据库,这里为False
Dim blnIsSQLServer As System.Boolean = False
Dim strSQL As String
Dim objDataset As New DataSet()
Dim objConn As Object
Dim strCnn As String

If blnIsSQLServer Then
strCnn = "User ID=sa;Initial Catalog=Northwind;Data Source=.\NetSDK;"
objConn = New System.Data.SqlClient.SqlConnection(strCnn)
objConn.Open()
Dim objAdapter As New System.Data.SqlClient.SqlDataAdapter()
strSQL = "Select * from customers where country='USA'"
objAdapter.SelectCommand = New System.Data.SqlClient.SqlCommand(strSQL, objConn)
objAdapter.Fill(objDataset)
Else
strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb")
objConn = New System.Data.OleDb.OleDbConnection(strCnn)
objConn.Open()
Dim objAdapter As New System.Data.OleDb.OleDbDataAdapter()
strSQL = "Select Top 10 Title From Document"
objAdapter.SelectCommand = New System.Data.OleDb.OleDbCommand(strSQL, objConn)
objAdapter.Fill(objDataset)
End If
Dim oView As New DataView(objDataset.Tables(0))
DataGrid1.DataSource = oView
DataGrid1.DataBind()
objConn.Close()
objConn.Dispose()
objConn = Nothing
If Request.QueryString("bExcel") = "1" Then
Response.ContentType = "application/vnd.ms-excel"
' 从Content-Type header中去除charset设置
Response.Charset = ""

' 关闭 ViewState
Me.EnableViewState = False
Dim tw As New System.IO.StringWriter()
Dim hw As New System.Web.UI.HtmlTextWriter(tw)
' 获取control的HTML
DataGrid1.RenderControl(hw)
' 把HTML写回浏览器
Response.Write(tw.ToString())
Response.End()
End If
End Sub

分享到:
评论

相关推荐

    asp.net文件传输(客户端,服务器)

    在这个场景中,我们将探讨 ASP.NET 在文件传输中的应用,包括客户端和服务器之间的交互。 1. **ASP.NET 文件上传** ASP.NET 提供了多种方式处理文件上传。一种常见的方法是使用 `&lt;input type="file"&gt;` HTML 控件...

    asp.net 使用保存文件对话框

    首先,我们需要理解的是,由于浏览器的安全限制,ASP.NET不能直接在客户端弹出保存文件对话框。因此,通常的做法是通过HTTP响应流来模拟这个过程。当用户点击“下载”按钮时,服务器端代码会处理请求,读取文件内容...

    asp.net获取(客户端)MAC地址实例

    综上所述,获取客户端MAC地址在ASP.NET中是一个复杂的过程,涉及到浏览器限制、服务器配置以及潜在的隐私问题。开发者应当理解这些限制,并根据具体需求选择合适的方法。在实际操作时,一定要遵守相关的隐私法规和...

    asp.net 导出 pdf 文件

    4. **Microsoft Reporting Services (SSRS)**:对于复杂报表,你可以利用 SSRS 来设计和渲染 PDF 报表,它提供了丰富的报表设计工具,并可以直接集成到 ASP.NET 应用中。 在 ASP.NET 中导出 PDF 时,通常会涉及以下...

    ASP.NET导出CSV文件

    在ASP.NET中,导出CSV(逗号分隔值)文件是一项常见的任务,它允许用户将数据以易于处理和导入到其他应用程序(如电子表格软件)的格式下载。CSV文件因其简单性和通用性而被广泛使用。 导出CSV文件的基本过程包括...

    asp.net版web文件管理器

    【ASP.NET Web 文件管理器详解】 ASP.NET Web 文件管理器是一种基于ASP.NET技术构建的用于在Web环境中管理和操作文件的应用程序。它允许用户通过浏览器界面浏览、上传、下载、删除、重命名、复制和移动服务器上的...

    asp.net+Ajax实现Excel文件导出

    本篇文章将详细讲解如何利用ASP.NET与Ajax技术实现在Web应用中导出Excel文件。 首先,ASP.NET是Microsoft开发的一个用于构建动态网站、Web应用程序和服务的框架。它基于.NET Framework,提供了丰富的服务器控件、...

    【ASP.NET编程知识】ASP.NET Core文件上传与下载实例(多种上传方式).docx

    在文件上传的实现中,需要使用 FileStream 来保存文件,并使用 CopyToAsync 方法来将文件写入到流中。同时,需要使用 Guid 来生成新的文件名,以避免文件名冲突。 知识点5: 文件上传的优点 使用 ASP.NET Core 的...

    ASP.NET 保存网页为图片

    在ASP.NET中,将网页保存为图片是一种常见的...综上所述,ASP.NET保存网页为图片涉及多个层次的技术,包括无头浏览器的使用、图片处理和文件操作等。通过合理的设计和实现,可以构建出高效且功能丰富的网页截图服务。

    ASP.NET通过HTML的上传文件标签来上传文件

    // 保存文件... } else { // 提示文件过大 } } else { // 提示只允许上传特定类型的文件 } ``` 此外,为了处理大量文件或实现更复杂的上传逻辑,如进度条显示、多文件上传,可以考虑使用第三方库,例如Ajax...

    asp.net 上传大文件进度条显示

    总的来说,实现ASP.NET大文件上传及进度条显示需要跨客户端和服务器端工作,涉及到文件流处理、HTTP请求限制的配置以及用户界面的实时更新。理解这些概念和技术对于构建高效的文件上传功能至关重要。

    ASP.NET上传图片文件

    本文将深入探讨如何在ASP.NET中实现图片上传,并且在客户端进行文件大小、尺寸和类型的验证,以及提供图片预览功能,同时确保兼容多种浏览器。 首先,我们需要一个HTML表单来收集用户选择的文件。在表单中,`...

    ASP.NET上传大文件到服务器失败解决方案.doc

    总的来说,解决ASP.NET上传大文件到服务器失败的问题,需要综合考虑服务器配置、代码实现、客户端支持以及服务器性能等因素。通过合理配置和采用合适的上传策略,可以有效地处理大文件上传,提升用户体验。

    ASP.NET WebAPI 实现文件上传下载缩略图访问

    在本场景中,我们将探讨如何利用ASP.NET WebAPI来实现文件的上传、下载以及图片的缩略图访问。 一、文件上传: 在ASP.NET WebAPI中,文件上传通常通过HttpPostedFileBase对象来处理。开发者需要创建一个API控制器...

    asp.net读取串口数据

    由于ASP.NET运行在服务器端,它并不能直接访问用户的本地硬件资源,包括串口。因此,我们通常需要在服务器上创建一个Windows服务,这个服务可以持续监听串口,并将接收到的数据存储或者推送到数据库或者消息队列。...

    Asp.net Flex 文件批量上传

    4. **服务器端处理**:接收到文件数据后,Asp.net需要将其保存到服务器的某个位置,这通常通过`System.IO.FileStream`类完成。同时,为了防止恶意文件上传,需要进行文件类型和大小的验证。 5. **错误处理和进度...

    ASP.NET2.0实现无刷新客户端回调的Callback机制

    在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...

    asp.net(C#)文件保存到数据库,上传下载

    在ASP.NET(C#)开发中,将文件保存到数据库并实现上传下载是常见的功能需求。这个场景通常涉及用户交互,比如用户通过网页上传文件,然后服务器将这些文件存储在数据库中,以便后续的下载或其他操作。以下是关于这...

    asp.net实现单文件下载

    在ASP.NET中,单文件下载是一项常见的功能,它允许用户从服务器端获取并保存特定的文件到他们的本地设备。这个过程涉及到多个关键知识点,包括HTTP协议、文件流处理、响应头设置以及用户交互的安全性。以下是对这些...

Global site tag (gtag.js) - Google Analytics