网页文件收费下载应用实现

通过流下载可以验证身份及收费等操作,还能避免路径外漏。

如果视频观看收费也建议使用流分段下载,这样防止文件整体被copy。爱奇艺VIP会员观看视频就是这样干的,分段观看15秒左右一段

1、文件普通下载方式:直接将<a href="XXXXXXXX/HOI.mp4"/>

2、通过一般处理程序流下载:<a href="DownLoad.ashx"/> 并没有获取到文件本身的路径

DownLoad.ashx后台代码:

 

    /// <summary>
    /// DownLoad 的摘要说明
    /// </summary>
    public class DownLoad : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //创建文件读取对象 C:\Users\ykmy\Desktop\缓存\WebApplication2\WebApplication2\js\hdnj01.mp4
            using (FileStream fileReader = new FileStream(@"C:\Users\ykmy\Desktop\缓存\WebApplication2\WebApplication2\js\hdnj01.mp4", FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                //(filename, FileMode.Append, FileAccess.Write,FileShare.Write))
                context.Response.ContentType = "application/octet-stream";
                context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(@"hdnj01.mp4", System.Text.Encoding.UTF8));
                context.Response.AddHeader("Content-Length", fileReader.Length.ToString());
                //指定文件一次读取时的字节长度
                byte[] by = new byte[1024 * 128];//控制速度[128KB]
                int count = 0;
                while (true)
                {
                    //将文件转换为二进制数据保存到内存中,同时返回读取字节的长度
                    count = fileReader.Read(by, 0, by.Length);
                    if (count == 0)//文件是否全部转换为二进制数据
                    {
                        break;
                    }
                    //将二进制数据转换为文件对象并保存到指定的物理路径中
                    context.Response.OutputStream.Write(by, 0, by.Length);
                    try
                    {
                        context.Response.Flush();
                        
                    }
                    catch
                    {
                        context.Response.Close();
                    }
                }
                context.Response.Close();
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

3、直接post通过网页下载 同上(属于流下载)

web:代码

                //调用
                postExcelFile(
                    PostData,
                    "/AjaxServer/XXXX.ashx?Action=XXXX&r=" + Math.random()
                );
               
            // 导出excel
            function postExcelFile(params, url) {
                //params是post请求需要的参数,url是请求url地址
                var form = document.createElement("form");
                form.style.display = "none";
                form.action = url;
                form.method = "post";
                document.body.appendChild(form);
                // 动态创建input并给value赋值
                for (var key in params) {
                    var input = document.createElement("input");
                    input.type = "hidden";
                    input.name = key;
                    input.value = params[key];
                    form.appendChild(input);
                }
                form.submit();
                form.remove();
            }

后台代码

 

   
                string strTime = DateTime.Now.ToString("yyyy-MM-dd_HHmmss");
                string strFile = currentContext.Server.MapPath("~/temp/check" + strTime + ".xls");
                 

                NPOIHelper.Export(dt, "", strFile);

                //-----下载 BEGIN------
                HttpContext curContext = HttpContext.Current;

                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.Charset = "UTF-8";
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                HttpContext.Current.Response.AddHeader("Content-Disposition",
                    "attachment; filename=" + HttpUtility.UrlEncode("XXXXXXList" + strTime + ".xls", Encoding.UTF8));
                //     HttpContext.Current.Response.AddHeader("Content-Length", strFile.Length.ToString());
                HttpContext.Current.Response.ContentType = "application/ms-excel";


                using (MemoryStream ms = NPOIHelper.Export(dt, ""))
                {
                    byte[] data = ms.ToArray();
                    HttpContext.Current.Response.BinaryWrite(data);
                }
                HttpContext.Current.Response.Flush();
                
                //-----下载 END------

 

附目录

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.IO;
using System.Text;
using NPOI;
using NPOI.HPSF;
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.POIFS;
using NPOI.Util;

namespace BitAuto.Equipment.Framework
{

    public class NPOIHelper
    {
        /// <summary>
        /// DataTable导出到Excel文件
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
        /// <param name="strHeaderText">表头文本</param>
        /// <param name="strFileName">保存位置</param>
        public static void Export(DataTable dtSource, string strHeaderText, string strFileName)
        {
            using (MemoryStream ms = Export(dtSource, strHeaderText))
            {
                using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
                {
                    byte[] data = ms.ToArray();
                    fs.Write(data, 0, data.Length);
                    fs.Flush();
                }
            }
        }

        public static void CommonWebExport(DataTable dtSource, string strFileName)
        {
            HttpContext curContext = HttpContext.Current;

            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));

            //HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());

            HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.BinaryWrite(CommonExport(dtSource).GetBuffer());

            HttpContext.Current.Response.End();

        }

        public static MemoryStream CommonExport(DataTable table)
        {
            MemoryStream ms = new MemoryStream();


            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.CreateSheet();

            HSSFRow headerRow = sheet.CreateRow(0);

            // handling header.
            foreach (DataColumn column in table.Columns)
                headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value

            // handling value.
            int rowIndex = 1;

            foreach (DataRow row in table.Rows)
            {
                HSSFRow dataRow = sheet.CreateRow(rowIndex);

                foreach (DataColumn column in table.Columns)
                {
                    dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                }

                rowIndex++;
            }

            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            return ms;
        }


        /// <summary>
        /// DataTable导出到Excel的MemoryStream
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Delphi是一种流行的集成开发环境(IDE),用于创建各种类型的桌面和移动应用程序。为了帮助开发者学习并熟悉Delphi编程,可以通过多种方式获得Delphi 实例下载。 首先,Embarcadero公司是Delphi的主要提供商,他们的官方网站(www.embarcadero.com)提供了Delphi的最新版本的免费试用下载。开发者可以在官方网站上注册,并下载适合自己需求的Delphi版本进行试用。 其次,Delphi社区提供了丰富的开源项目和示例代码。通过访问Delphi开发者社区网站(如www.delphipraxis.net),开发者可以在论坛和社区中获取他人分享的Delphi实例代码,并下载到自己的本地环境进行学习和修改。 另外,一些第三方网站和资源库也存有大量的Delphi实例代码可供下载。例如,GitHub是一个流行的代码托管平台,上面有许多与Delphi相关的开源项目,开发者可以搜索并下载这些项目的源代码。 此外,一些Delphi书籍和教程也提供了附带的示例代码和实例下载链接。通过阅读这些书籍,开发者不仅可以学习Delphi的基础知识,还可以通过下载实例代码进行动手实践。 总而言之,获取Delphi实例的途径多种多样,开发者可以通过Embarcadero官方网站、Delphi社区、第三方网站和资源库以及相关书籍和教程来充实自己的Delphi编程技能。通过实例的下载和学习,开发者可以更好地理解Delphi编程的方法和技巧,并在实际项目中应用它们。 ### 回答2: Delphi是一种极受欢迎的面向对象的编程语言,广泛应用于Windows平台的软件开发。在使用Delphi进行开发时,我们经常需要参考一些实例代码来帮助我们理解和解决问题。 要下载Delphi的实例代码,我们可以采取以下几种途径: 1. 官方资源:Embarcadero公司是Delphi的开发商,在其官方网站上提供了大量的资源供开发者下载和学习。我们可以登录Embarcadero官方网站,找到Delphi的下载页面,其中会包含一些示例代码的下载链接。这些示例代码可以帮助我们学习Delphi的基本语法和常用功能。 2.开源社区:Delphi有一个活跃的开源社区,其中有很多开发者分享了自己编写的Delphi示例代码。我们可以在GitHub等开源代码托管网站上搜索Delphi相关的项目,会有很多开源项目供我们参考和下载。另外,我们还可以参加一些Delphi的开发者交流群组,向其他开发者寻求帮助并获取他们的实例代码。 3.教学网站:有一些专门的教学网站,他们提供Delphi的学习资料和实例代码下载。这些网站会提供一些免费的示例代码供我们学习,还有一些收费的教程和项目源码。我们可以在搜索引擎上搜索这些Delphi教学网站,找到适合自己的资源。 需要注意的是,在下载实例代码时,我们需要选择适合自己所需的示例代码。因为Delphi是一个广泛应用的编程语言,在不同的领域和场景上有很多不同的应用。所以在下载实例代码时,我们应该选择和我们正在进行的项目相关的实例代码,这样能更好地帮助我们解决问题和学习。 ### 回答3: Delphi是一种基于Object Pascal语言的集成开发环境(IDE),主要用于开发Windows平台的应用程序。在Delphi中,开发者可以使用图形化的用户界面设计工具和强大的编程语言来创建各种类型的应用程序,包括桌面应用程序、移动应用程序和数据库应用程序。 要下载Delphi的实例,可以按照以下步骤进行操作: 1. 打开Embarcadero官方网站(www.embarcadero.com)。 2. 导航到Delphi产品页面。 3. 在产品页面上,寻找一个名为“示例项目”或类似的选项。 4. 点击该选项,浏览现有的示例项目列表。 5. 选择你感兴趣的示例项目,并点击下载按钮。 6. 在下载页面上,选择适合你系统的版本(32位或64位)。 7. 确认下载选项和License Agreement,并点击下载按钮开始下载。 8. 下载完成后,将文件保存到你的计算机上的一个合适的位置。 完成上述步骤后,你就成功地下载了Delphi的实例。接下来,你可以使用Delphi IDE打开这些实例项目,浏览其代码和资源,了解项目的结构和实现。通过学习这些示例项目,你可以掌握Delphi的开发技术,提升自己在应用程序开发中的能力。同时,你还可以根据自己的需求修改和定制这些示例项目,以便于快速开发出满足自己需求的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值