二开实现给文件下载接口设置 Content-Disposition 响应头

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:3

二开实现给文件下载接口设置 Content-Disposition 响应头

【应用场景】

部分加密软件部署在网关,需要根据响应头中的 Content-Dispositon: attachment; filename=****.xlsx 来判断文件类型,从而决定是否要加密。


【注意事项】

如无开发能力,可直接下载文末的附件使用,但不保证所有版本可用。


【实现步骤】

<1>新建类库项目,添加Kingdee.BOS.dll 和 Kingdee.BOS.Web.dll 的引用。


<2>安装 Lib.Harmony 的 NuGet 包。



<3>新建 Dowmload 类 和 DownloadExportFile 类,代码如下。

namespace Custom.Web
{
    public class Download : Kingdee.BOS.Web.FileServer.Download
    {
        static Download()
        {
            Patcher.ApplyPatches();
        }
    }
}
namespace Custom.Web
{
    public class DownloadExportFile : Kingdee.BOS.Web.FileServer.DownloadExportFile
    {
        static DownloadExportFile()
        {
            Patcher.ApplyPatches();
        }
    }
}


<4>新建 Patcher 类,代码如下

using HarmonyLib;
using Kingdee.BOS.Log;
using System;
using System.Reflection;
using System.Web;

namespace Custom.Web
{
    internal class Patcher
    {
        private static bool _patched = false;
        private static object _patchedLock = new object();

        public static void ApplyPatches()
        {
            try
            {
                if (!_patched)
                {
                    lock (_patchedLock)
                    {
                        if (!_patched)
                        {
                            var harmony = new Harmony("filedownload.startup.patch");

                            // 获取目标类型的 MethodBase
                            MethodBase targetMethod = Type.GetType("Kingdee.BOS.KDHttpUtility.RequestUtility,Kingdee.BOS")
                                .GetMethod("AddAttachmentHeader", new Type[] { typeof(HttpContext), typeof(string) });

                            // 定义补丁方法
                            var prefixMethod = typeof(Patcher).GetMethod("PrefixMethod", BindingFlags.Static | BindingFlags.NonPublic);
                            //var postfixMethod = typeof(Patcher).GetMethod("PostfixMethod", BindingFlags.Static | BindingFlags.NonPublic);
                            harmony.Patch(targetMethod, new HarmonyMethod(prefixMethod), null);
                            Logger.Error("Custom.Web.Patcher", "运行时补丁成功", null);
                            _patched = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Custom.Web.Patcher", "运行时补丁失败", ex);
            }
        }

        private static bool PrefixMethod(ref HttpContext context, ref string fileName)
        {
            // 前缀补丁的代码
            fileName = fileName.Replace("+", "%20");

            // 在这里设置附件下载请求的响应头,可以根据需要自行修改
            context.Response.AddHeader("Content-Disposition", "attachment;" + "filename=" + fileName + ";filename*=utf-8''" + fileName);
            return false;
        }

        //private static void PostfixMethod(YourTargetClass __instance)
        //{
        //    // 后缀补丁的代码
        //    Console.WriteLine("After method execution.");
        //}

    }
}


<5>编译后将 Custom.Web.dll 和 0Harmony.dll 放到星空服务端安装目录下"Kingdee\K3Cloud\WebSite\bin"文件夹中


<6>备份星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\Download.aspx"文件


<7>用记事本打开星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\Download.aspx"文件,修改其中内容如下

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Download.cs" Inherits="Custom.Web.Download,Custom.Web" %>


<8>备份星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\DownloadExportFile.ashx"文件。


<9>用记事本打开星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\DownloadExportFile.ashx"文件,修改其中内容如下。

<%@ WebHandler Language="C#" Class="Custom.Web.DownloadExportFile"  Codebehind="DownloadExportFile.cs"%>


<10>访问如下地址后,查看星空Website站点日志,看到有“运行时补丁成功”就说明已经成功了

http://替换成实际星空地址/K3Cloud/FileUpLoadServices/Download.aspx


<11>此时抓包下载文件接口,可以看到响应头已经设置上去了



【其他】

如无二开能力,可以直接下载以下文件使用

附件.zip

解压后将 Custom.Web.dll 和 0Harmony.dll 放到星空服务端安装目录下"Kingdee\K3Cloud\WebSite\bin"文件夹中,

用 Download.aspx 替换星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\Download.aspx"文件

用 DownloadExportFile.ashx 替换星空服务端安装目录下的"Kingdee\K3Cloud\WebSite\FileUpLoadServices\DownloadExportFile.ashx"文件



二开实现给文件下载接口设置 Content-Disposition 响应头

【应用场景】部分加密软件部署在网关,需要根据响应头中的 Content-Dispositon: attachment; filename=****.xlsx 来判断文件类型,从而...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息