📄 subject_60859.htm
字号:
<p>
序号:60859 发表者:Toy 发表日期:2003-11-16 02:07:48
<br>主题:关于文件上传下载的问题
<br>内容:我正在写一个文件上传下载的东西<BR>是一个 Web 用户界面的应用程序(c#)<BR>要求是从客户端的文件上传到服务器的mssql数据库中<BR>然后可以从数据库中下载到本地<BR>上传这部分已经写好了<BR>我可能在下载的时候有点问题<BR>哪位朋友以前做过或是有例子的<BR>麻烦贴来参考一下<BR>谢谢了
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:雷神 回复日期:2003-11-18 09:48:26
<br>内容:一. 在Form中一定要将encType设为"multipart/form-data":<BR><form id="WebForm3" method="post" encType="multipart/form-data" runat="server" ><BR><BR>二. 判断是否有文件上传了:<BR>当用户没有选择任何要上传的文件,即HtmlInputFile控件中的文本框为空时点击了上传按钮后,在服务端得到的File1.PostedFile对象不是null,而是有对象的,所以不能用(File1.PostedFile == null)来判断是否上传了文件,用(File1.PostedFile.ContentLength != 0)来判断比较好<BR><BR>三. 判断上传文件MIMIE类型:<BR>文件上传后可以用File1.PostedFile.ContentType来读取这个文件的MIMIE类型,这个MIMIE类型是系统通过上传文件的后缀名来获得的。<BR><BR>四. 保存上传的文件:<BR><BR>1. 文件可以通过File1.PostedFile.SaveAs(path) //path是服务器上的物理路径,来保存文件。<BR><BR>if(File1.PostedFile.ContentLength != 0)<BR><BR>{<BR><BR>StringBuilder myStr = new StringBuilder();<BR><BR>myStr.Append("文件名称:" + File1.PostedFile.FileName);<BR><BR>myStr.Append("<br>");<BR><BR>myStr.Append("文件类型:" + File1.PostedFile.ContentType);<BR><BR>myStr.Append("<br>");<BR><BR>myStr.Append("文件长度:" + File1.PostedFile.ContentLength.ToString());<BR><BR>myStr.Append("<br>");<BR><BR> <BR><BR>string path = Server.MapPath("./"); //当前路径<BR><BR>string fileName = File1.PostedFile.FileName.Substring(File1.PostedFile.FileName.LastIndexOf('\\')+1);<BR><BR>path += fileName;<BR><BR>if(File.Exists(path) == true)<BR><BR>{<BR><BR>Label1.Text = "服务器上已经有了你正在上传的文件:" + fileName;<BR><BR>return;<BR><BR>}<BR><BR>File1.PostedFile.SaveAs(path);<BR><BR> <BR><BR>myStr.Append("保存完毕!");<BR><BR>myStr.Append("<br>");<BR><BR>Label1.Text = myStr.ToString();<BR><BR>}<BR><BR>else<BR><BR>{<BR><BR>Label1.Text = "你没有选择要上载的文件或者上传的文件长度为0!";<BR><BR>}<BR><BR><BR>2. 文件也可以通过二进制的读取后存放到数据库的二进制的字段中:<BR>byte[] fileCont = new byte[File1.PostedFile.ContentLength];<BR>File1.PostedFile.InputStream.Read(fileCont,0, File1.PostedFile.ContentLength);<BR>然后将此字节数组fileCont赋给数据库的二进制字段的参数,写到数据库中。<BR><BR> <BR><BR>文件下载<BR><BR>一. 服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式:<BR><meta http-equiv="Content-Type" content="text/htm "><BR>http-equiv表示是Headers的名称,content表示这个Headers的值<BR><BR>二. 首先,要输出文件的MIME类型:<BR>Page.Response.AddHeader( "Content-Type", “MIME类型” );<BR><BR>三. 其次,要输出下载的文件的打开位置和文件名:<BR>Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );<BR>content-disposition 的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。<BR>attachment ―― 表示作为附件发送到客户端,客户端将单独打开此文件。<BR>inline ―― 表示将在浏览器中打开这个文件。<BR>filename ―― 表示发送到客户端文件的文件名。<BR><BR>四. 准备发送到客户端的文件数据:<BR>不管什么类型的文件都要先转成byte类型的数组,然后将这个byte数组用Response.BinaryWrite方法输出到客户端。<BR><BR>1. 读取文件来获得byte数组: string FileName; //生成或获取要发送到客户端的文件名<BR><BR>string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下<BR><BR>if(File.Exists(filePath) == false)<BR><BR>{<BR><BR>//服务器上没有这个文件<BR><BR>return;<BR><BR>}<BR><BR>FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream<BR><BR>byte[] fileCont = new byte[myFile.Length];<BR><BR>myFile.Read(fileCont,0,(int)myFile.Length); //将文件流中的内容转成byte数组<BR><BR><BR>2. 在数据库的二进制字段中读取: //从url获取图片的id<BR><BR>string ImageId = Request.QueryString["img"];<BR><BR>//构建查询语句<BR><BR>string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;<BR><BR>SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );<BR><BR>SqlCommand command = new SqlCommand( sqlText, connection);<BR><BR>connection.Open();<BR><BR>SqlDataReader dr = command.ExecuteReader();<BR><BR>if ( dr.Read())<BR><BR>{<BR><BR>byte[] fileCont = (byte[]) dr["img_data"] ;<BR><BR>}<BR><BR>connection.Close();<BR><BR><BR> <BR><BR>通过上述两种方法获得的文件内容的byte数组就可以用来输出了:<BR>Page.Response.BinaryWrite(fileCont);<BR><BR>Page.Response.End();<BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Toy 回复日期:2003-11-18 13:15:39
<br>内容:雷神不愧是老大啊<BR>谢谢你这贴<BR>我就是在<BR>Page.Response.AddHeader( "Content-Type", “MIME类型” );<BR>Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );<BR>这里出的问题<BR>其他部分跟你写的都差不多<BR>只是没加上 上面2句话<BR>所以造成了客户端不能识别我Response.BinaryWrite(fileCont);<BR>过去的文件<BR><BR>非常感谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Toy 回复日期:2003-11-18 13:17:11
<br>内容:Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );<BR><BR>如果FileName为中文,会出现乱码的情况<BR>不知是怎么会事<BR>还是我哪里没做好?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Toy 回复日期:2003-11-19 17:19:39
<br>内容:还存在一个问题<BR>用<BR>byte[] imgBinaryData = new byte[UploadFile.PostedFile.ContentLength];<BR> UploadFile.PostedFile.InputStream.Read(imgBinaryData,0, UploadFile.PostedFile.ContentLength);<BR><BR>读取时,如果文件比较大(我试了个63M的)就不行了<BR>页面不报错<BR>直接显示<BR>"该页无法显示"<BR><BR>我上传比较小的文件是可以成功的<BR>不知道是怎么回事啊?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Toy 回复日期:2003-11-19 17:21:02
<br>内容:数据库中的字段是使用的Image类型<BR>是否这里出的问题?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雷神 回复日期:2003-11-20 08:52:34
<br>内容:中文名称不支持是微软系统造成的。<BR>读取失败,应该不是使用的Image类型的问题。<BR><BR>其实用C#不用借助数据库。可以Request.Files取得上传文件,用SaveAS方法存文件,非常简单。可以参考我以前的一篇文章。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雷神 回复日期:2003-11-20 08:53:25
<br>内容:http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=287
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Toy 回复日期:2003-11-20 10:53:48
<br>内容:唉<BR>要求就是要传入数据库中啊<BR>实际上传到数据库中也是有很多好处的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -