二开实现给文件下载接口设置 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>此时抓包下载文件接口,可以看到响应头已经设置上去了
【其他】
如无二开能力,可以直接下载以下文件使用
解压后将 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 响应头
本文2024-09-23 03:43:39发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-160714.html