欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【转载】ASP.NET实现文件下载的功能

程序员文章站 2022-08-31 12:29:14
文件下载是很多网站中含有的常用功能,在ASP.NET中可以使用FileStream类、HttpRequest对象、HttpResponse对象相互结合,实现输出硬盘文件的功能。该方法支持大文件、续传、速度限制、资源占用小。 FileStream类:MSDN上的解释为,FileStrem类对文件系统上 ......

文件下载是很多网站中含有的常用功能,在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

 

备注:原文转载自asp.net实现文件下载的功能_it技术小趣屋