在我们的系统的编写过程中,应该有很多的时候需要客户下载文件.我第一次的做法(应该也是大部分人的做法吧?)是:
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
6protectedvoidDownloadFile(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 在文件传输中的应用,包括客户端和服务器之间的交互。 1. **ASP.NET 文件上传** ASP.NET 提供了多种方式处理文件上传。一种常见的方法是使用 `<input type="file">` HTML 控件...
首先,我们需要理解的是,由于浏览器的安全限制,ASP.NET不能直接在客户端弹出保存文件对话框。因此,通常的做法是通过HTTP响应流来模拟这个过程。当用户点击“下载”按钮时,服务器端代码会处理请求,读取文件内容...
综上所述,获取客户端MAC地址在ASP.NET中是一个复杂的过程,涉及到浏览器限制、服务器配置以及潜在的隐私问题。开发者应当理解这些限制,并根据具体需求选择合适的方法。在实际操作时,一定要遵守相关的隐私法规和...
4. **Microsoft Reporting Services (SSRS)**:对于复杂报表,你可以利用 SSRS 来设计和渲染 PDF 报表,它提供了丰富的报表设计工具,并可以直接集成到 ASP.NET 应用中。 在 ASP.NET 中导出 PDF 时,通常会涉及以下...
在ASP.NET中,导出CSV(逗号分隔值)文件是一项常见的任务,它允许用户将数据以易于处理和导入到其他应用程序(如电子表格软件)的格式下载。CSV文件因其简单性和通用性而被广泛使用。 导出CSV文件的基本过程包括...
【ASP.NET Web 文件管理器详解】 ASP.NET Web 文件管理器是一种基于ASP.NET技术构建的用于在Web环境中管理和操作文件的应用程序。它允许用户通过浏览器界面浏览、上传、下载、删除、重命名、复制和移动服务器上的...
本篇文章将详细讲解如何利用ASP.NET与Ajax技术实现在Web应用中导出Excel文件。 首先,ASP.NET是Microsoft开发的一个用于构建动态网站、Web应用程序和服务的框架。它基于.NET Framework,提供了丰富的服务器控件、...
在文件上传的实现中,需要使用 FileStream 来保存文件,并使用 CopyToAsync 方法来将文件写入到流中。同时,需要使用 Guid 来生成新的文件名,以避免文件名冲突。 知识点5: 文件上传的优点 使用 ASP.NET Core 的...
在ASP.NET中,将网页保存为图片是一种常见的...综上所述,ASP.NET保存网页为图片涉及多个层次的技术,包括无头浏览器的使用、图片处理和文件操作等。通过合理的设计和实现,可以构建出高效且功能丰富的网页截图服务。
// 保存文件... } else { // 提示文件过大 } } else { // 提示只允许上传特定类型的文件 } ``` 此外,为了处理大量文件或实现更复杂的上传逻辑,如进度条显示、多文件上传,可以考虑使用第三方库,例如Ajax...
总的来说,实现ASP.NET大文件上传及进度条显示需要跨客户端和服务器端工作,涉及到文件流处理、HTTP请求限制的配置以及用户界面的实时更新。理解这些概念和技术对于构建高效的文件上传功能至关重要。
本文将深入探讨如何在ASP.NET中实现图片上传,并且在客户端进行文件大小、尺寸和类型的验证,以及提供图片预览功能,同时确保兼容多种浏览器。 首先,我们需要一个HTML表单来收集用户选择的文件。在表单中,`...
总的来说,解决ASP.NET上传大文件到服务器失败的问题,需要综合考虑服务器配置、代码实现、客户端支持以及服务器性能等因素。通过合理配置和采用合适的上传策略,可以有效地处理大文件上传,提升用户体验。
在本场景中,我们将探讨如何利用ASP.NET WebAPI来实现文件的上传、下载以及图片的缩略图访问。 一、文件上传: 在ASP.NET WebAPI中,文件上传通常通过HttpPostedFileBase对象来处理。开发者需要创建一个API控制器...
由于ASP.NET运行在服务器端,它并不能直接访问用户的本地硬件资源,包括串口。因此,我们通常需要在服务器上创建一个Windows服务,这个服务可以持续监听串口,并将接收到的数据存储或者推送到数据库或者消息队列。...
4. **服务器端处理**:接收到文件数据后,Asp.net需要将其保存到服务器的某个位置,这通常通过`System.IO.FileStream`类完成。同时,为了防止恶意文件上传,需要进行文件类型和大小的验证。 5. **错误处理和进度...
在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...
在ASP.NET(C#)开发中,将文件保存到数据库并实现上传下载是常见的功能需求。这个场景通常涉及用户交互,比如用户通过网页上传文件,然后服务器将这些文件存储在数据库中,以便后续的下载或其他操作。以下是关于这...
在ASP.NET中,单文件下载是一项常见的功能,它允许用户从服务器端获取并保存特定的文件到他们的本地设备。这个过程涉及到多个关键知识点,包括HTTP协议、文件流处理、响应头设置以及用户交互的安全性。以下是对这些...