Sitecore:将页面上的所有文件下载为压缩文件
Sitecore: Download all files on a page as a zipped file
我在一个页面上有几个文件的链接。
用户可以单击每个文件的下载按钮,也可以单击全部下载。如果他点击全部下载,则该页面上的所有文件都必须以压缩文件的形式下载。
这些文件在媒体库中,它们的 url 是,例如:
url = "/~/media/file.ashx"
如果我想单独下载它,它可以
Response.Redirect(url);
如果我写这段代码来压缩文件,
FileUtil.ZipFiles("/myzip.zip", new[]{url})
它抛出以下异常:
找不到部分路径 "c:\~\media\file.ashx"
我猜抛出这个异常是因为它希望文件存在于文件系统中。
我想将所有文件打包成一个 zip 文件,然后下载压缩文件。我不想将压缩文件添加到媒体库中。
这甚至可能吗?
您将需要创建一个新的 httpRequestBegin 管道来查找您的自定义 URL 而不是根据 Sitecore 项目解析器解析它。在该管道中,您可以让它做您喜欢的事情。它类似于您对 301 重定向所做的操作。
https://laubplusco.net/url-mappings-in-sitecore-done-easy/
http://insitecore.tumblr.com/post/37848690556/thoughts-on-httprequestbegin-custom-item-lookups
这是代码。感谢以上 post.
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
第 3 方库创建 zip 文件。
然后您可以将其转换为字节数组并执行类似这样的操作来强制下载 - 对于 MVC,这是在控制器渲染中 returning a FileResult
。您可以在控制器上对此操作执行 RedirectToAction
string contentType;
ContentDisposition cd;
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
您也可以使用流水线处理器来调用上述代码。处理器必须检查请求 URL 中的特定模式,例如 /Myzip 和 return 响应。这里的示例使用处理器 return 响应
我在一个页面上有几个文件的链接。
用户可以单击每个文件的下载按钮,也可以单击全部下载。如果他点击全部下载,则该页面上的所有文件都必须以压缩文件的形式下载。 这些文件在媒体库中,它们的 url 是,例如: url = "/~/media/file.ashx"
如果我想单独下载它,它可以
Response.Redirect(url);
如果我写这段代码来压缩文件,
FileUtil.ZipFiles("/myzip.zip", new[]{url})
它抛出以下异常: 找不到部分路径 "c:\~\media\file.ashx" 我猜抛出这个异常是因为它希望文件存在于文件系统中。
我想将所有文件打包成一个 zip 文件,然后下载压缩文件。我不想将压缩文件添加到媒体库中。 这甚至可能吗?
您将需要创建一个新的 httpRequestBegin 管道来查找您的自定义 URL 而不是根据 Sitecore 项目解析器解析它。在该管道中,您可以让它做您喜欢的事情。它类似于您对 301 重定向所做的操作。
https://laubplusco.net/url-mappings-in-sitecore-done-easy/
http://insitecore.tumblr.com/post/37848690556/thoughts-on-httprequestbegin-custom-item-lookups
这是代码。感谢以上 post.
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
第 3 方库创建 zip 文件。
然后您可以将其转换为字节数组并执行类似这样的操作来强制下载 - 对于 MVC,这是在控制器渲染中 returning a FileResult
。您可以在控制器上对此操作执行 RedirectToAction
string contentType;
ContentDisposition cd;
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
您也可以使用流水线处理器来调用上述代码。处理器必须检查请求 URL 中的特定模式,例如 /Myzip 和 return 响应。这里的示例使用处理器 return 响应