Sitecore:将页面上的所有文件下载为压缩文件

本文关键字:文件下载 压缩 文件 Sitecore | 更新日期: 2023-09-27 18:35:39

我有一个页面上几个文件的链接。

用户可以单击每个文件的下载按钮,然后单击全部下载。如果他单击全部下载,则该页面上的所有文件都必须下载为压缩文件。这些文件位于媒体库中,其网址为,例如:url = "/~/media/file.ashx"

如果我想单独下载它,它可以工作

Response.Redirect(url);

如果我编写此代码来压缩文件,

FileUtil.ZipFiles("/myzip.zip", new[]{url})

它引发以下异常:找不到路径"c:''~''media''file.ashx"的一部分我猜抛出此异常是因为它希望文件存在于文件系统上。

我想将所有文件

捆绑在一个zip文件中,然后下载压缩文件。我不想将压缩文件添加到媒体 zibrary。这可能吗?

Sitecore:将页面上的所有文件下载为压缩文件

您将需要创建一个新的 httpRequestBegin 管道来查找您的自定义网址,而不是针对 Sitecore 项目解析程序解析它。在该管道中,您可以让它做您喜欢的事情。它类似于您使用 301 重定向执行的操作。

https://laubplusco.net/url-mappings-in-sitecore-done-easy/

http://insitecore.tumblr.com/post/37848690556/thoughts-on-httprequestbegin-custom-item-lookups

这是代码。归功于上述帖子。

using Sitecore;
using Sitecore.Pipelines.HttpRequest;
namespace InSitecore.Sample {
    public class CustomItemResolver : HttpRequestProcessor {
        public override void Process( HttpRequestArgs args ) {
            if( Context.Item == null ) {
                return;
            }
            // Implement custom custom item lookup logic here
        }
    }
}

这是配置补丁。

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <httpRequestBegin>
        <processor type="InSitecore.Sample,InSitecore.Sample"
          patch:before=
"processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" />
      </httpRequestBegin>
    </pipelines>
  </sitecore>
</configuration>

可能有点矫枉过正,但您可以使用 Sitecore 媒体项的GetMediaStream()方法,然后将每个流添加到 zip 文件中。 像这样:

      using (ZipOutputStream zipStream = new  ZipOutputStream(File.Create(AppDomain.CurrentDomain.BaseDirectory + @"'App_Data'" + outputFileLocation)))
      {
            zipStream.SetLevel(9); 
            foreach (var mediaItem in mediaItems)
            {
                    var memStream = mediaItem.GetMediaStream();
                    Contract.Assume(memStream != null);
                    ZipEntry newEntry = new ZipEntry(mediaItem.Name + "." + mediaItem.Extension);
                    zipStream.PutNextEntry(newEntry);
                    StreamUtils.Copy(memStream, zipStream, new byte[4096]);
                    zipStream.CloseEntry();
            }
            zipStream.Finish();
            zipStream.Close();
        }

这是使用ICSharpCode第三方库来创建zip文件。

然后,您可以将其转换为字节数组并执行类似操作来强制执行下载 - 对于 MVC,这是在返回FileResult的控制器渲染中。您可以在控制器上对此操作执行重定向操作

        string contentType;
        ContentDisposition cd;
        Response.AppendHeader("Content-Disposition", cd.ToString());
        return File(filedata, contentType);

您还可以使用管道处理器来调用上述代码。处理器必须检查请求 URL 中的特定模式,例如/Myzip 并返回响应。此处使用处理器返回响应的示例

http://sitecorejunkie.com/2016/01/24/yet-another-httprequestbegin-pipeline-processor-to-handle-page-not-found-404-status-code/