欢喜密探下载,画蛇添足造句,小教室
文件下载是很多网站中含有的常用功能,在asp.net中可以使用filestream类、httprequest对象、httpresponse对象相互结合,实现输出硬盘文件的功能。该方法支持大文件、续传、速度限制、资源占用小。
filestream类:msdn上的解释为,filestrem类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。filestream 对输入输出进行缓冲,从而提高性能。
response对象:asp.net网站中对外输出信息流的基础对象实体。
封装后的方法如下:
#region responsefile 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 /// <summary> /// 输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 /// </summary> /// <param name="_request">page.request对象</param> /// <param name="_response">page.response对象</param> /// <param name="_filename">下载文件名</param> /// <param name="_fullpath">带文件名下载路径</param> /// <param name="_speed">每秒允许下载的字节数</param> /// <returns>返回是否成功</returns> public static bool responsefile(httprequest _request, httpresponse _response, string _filename, string _fullpath, long _speed) { try { filestream myfile = new filestream(_fullpath, filemode.open, fileaccess.read, fileshare.readwrite); binaryreader br = new binaryreader(myfile); try { _response.addheader("accept-ranges", "bytes"); _response.buffer = false; long filelength = myfile.length; long startbytes = 0; int pack = 10240; //10k bytes //int sleep = 200; //每秒5次 即5*10k bytes每秒 int sleep = (int)math.floor((double)(1000 * pack / _speed)) + 1; if (_request.headers["range"] != null) { _response.statuscode = 206; string[] range = _request.headers["range"].split(new char[] { '=', '-' }); startbytes = convert.toint64(range[1]); } _response.addheader("content-length", (filelength - startbytes).tostring()); if (startbytes != 0) { _response.addheader("content-range", string.format(" bytes {0}-{1}/{2}", startbytes, filelength - 1, filelength)); } _response.addheader("connection", "keep-alive"); _response.contenttype = "application/octet-stream"; _response.addheader("content-disposition", "attachment;filename=" + httputility.urlencode(_filename, system.text.encoding.utf8)); br.basestream.seek(startbytes, seekorigin.begin); int maxcount = (int)math.floor((double)((filelength - startbytes) / pack)) + 1; for (int i = 0; i < maxcount; i++) { if (_response.isclientconnected) { _response.binarywrite(br.readbytes(pack)); thread.sleep(sleep); } else { i = maxcount; } } } catch { return false; } finally { br.close(); myfile.close(); } } catch { return false; } return true; } #endregion
备注:原文转载自。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论