gpt4 book ai didi

image - 如何强制下载 Sitecore 媒体项目(图片)?

转载 作者:行者123 更新时间:2023-12-01 05:08:47 25 4
gpt4 key购买 nike

单击 Sitecore 媒体链接后,我需要强制下载操作。我没有找到任何有用的 Sitecore 推进如何实现这一目标。

在 Sitecore 配置中,您可以定义将强制下载哪些 MIME 类型。但问题是,如果你想为图像做这件事。因为如果你这样做

<mediaType name="JPEG image" extensions="jpg, jpeg, jpe">
<mimeType>image/jpeg</mimeType>
<forceDownload>true</forceDownload>
</mediaType>

所有图像都将消失,因为浏览器将无法以 HTML 格式呈现它们!

如何让所有 Sitecore 媒体文件在点击时强制下载?

最佳答案

在使用反编译器对 Sitecore 的代码进行一些调查后,我决定最好的方法是扩展 Sitecore MediaRequestHandler。

但是如何识别是否要呈现图像并下载图像?我们必须向 URL 添加查询字符串参数,例如“dl=1”

public class MediaRequestHandler : Sitecore.Resources.Media.MediaRequestHandler, System.Web.SessionState.IRequiresSessionState
{
protected override bool DoProcessRequest(HttpContext context, MediaRequest request, Media media)
{
// identify query string param from requested URL
bool isDownload = Utils.UrlUtils.HasQueryParam(context.Request.Url, "dl", "1");
if (isDownload)
{
using (MediaStream stream = media.GetStream())
{
// we have to check if file is not already force downloaded by Sitecore
if (!stream.ForceDownload)
{
string mediaName = media.MediaData.MediaItem.Name + "." + media.MediaData.Extension;
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + mediaName + "\"");
}
context.Response.AddHeader("Content-Length", stream.Length.ToString());
}
}
// it must be called after all logic
return base.DoProcessRequest(context, request, media);
}
}

代码的一些说明:
  • 所有逻辑必须在调用原始 DoProcessRequest 方法之前因为处理后它会将所有 header 刷新到响应(!)
  • 那里必须是查询字符串参数 决定是否强制下载文件
  • 一些 mime 类型 已经有“forcedownload”属性 从配置,所以你必须检查它以避免重复标题 “内容处理”(这会导致 Chrome 出现问题,下载的文件将具有类似“文件名-,附件”的扩展名)
  • 关于image - 如何强制下载 Sitecore 媒体项目(图片)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com