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

C# Sitecore:将页面上的所有文件作为压缩文件下载,c#,download,zip,sitecore,C#,Download,Zip,Sitecore,我在一个页面上有几个文件的链接 用户可以单击每个文件的“下载”按钮,或者单击“全部下载”。如果他单击download all,则该页面上的所有文件都必须作为压缩文件下载。 文件位于媒体库中,其url为,例如: url=“/~/media/file.ashx” 如果我想单独下载它,它可以工作 Response.Redirect(url); 如果我写这段代码来压缩文件 FileUtil.ZipFiles("/myzip.zip", new[]{url}) 它引发以下异常: 找不到路径“c:\~\

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

用户可以单击每个文件的“下载”按钮,或者单击“全部下载”。如果他单击download all,则该页面上的所有文件都必须作为压缩文件下载。 文件位于媒体库中,其url为,例如: url=“/~/media/file.ashx”

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

Response.Redirect(url);
如果我写这段代码来压缩文件

FileUtil.ZipFiles("/myzip.zip", new[]{url})
它引发以下异常: 找不到路径“c:\~\media\file.ashx”的一部分 我猜抛出此异常是因为它希望文件存在于文件系统中

我想把所有文件打包成一个zip文件,然后下载压缩文件。我不想将压缩文件添加到媒体zibrary。
这可能吗?

您需要创建一个新的httpRequestBegin管道来查找自定义URL,而不是根据Sitecore项目解析程序解析它。在这个管道中,你可以让它做你喜欢的事情。这与301重定向类似

这是代码。归功于上述职位

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();
        }
这是使用第三方库创建zip文件

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

        string contentType;
        ContentDisposition cd;

        Response.AppendHeader("Content-Disposition", cd.ToString());
        return File(filedata, contentType);
您还可以使用管道处理器来调用上述代码。处理器必须检查请求URL中的特定模式,例如/Myzip,然后返回响应。这里是使用处理器返回响应的示例


我认为他的问题在于他调用的是一个不存在的url。你的代码非常有用,但只有在他解析url后才能使用。是的,这就是问题所在。在处理程序解析URL之前,URL不存在。您可能需要执行web请求以获取文件的内容,然后将其放入zip文件中。这里有一个例子