如何强制下载Sitecore媒体项目(图像)?

时间:2014-10-23 09:54:23

标签: image download sitecore handler media

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

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

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

所有图片都会消失,因为浏览器无法以HTML格式显示它们!

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

1 个答案:

答案 0 :(得分:1)

在使用反编译器对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方法之前,因为在处理之后它会将所有标题刷新为响应(!)
  • 必须是查询字符串参数,决定是否强行下载文件
  • 某些mime类型已从配置中获得“forcedownload”属性,因此您必须检查它以避免重复标题“Content-Disposition”(这会导致Chrome中的问题,下载的文件将具有类似“filename-,attachment”)的扩展名