将 ImageResizer 与自定义查询字符串一起使用
Using ImageResizer with custom query string
我正在使用 ImageResizer,而客户端查找具有以下格式的图像:http://website/imagehandler.aspx?id=120&width=240&height=300
这是使用文件夹层次结构寻址图像的另一种方式,因为我使用 id 来查找图像位置。
以前,我为我的使用案例编写了一个自定义插件,但我在该解决方案中遇到了一些线程安全问题,如下所述:imageresizer-shows-wrong-image。
Nathanael(图像缩放器的开发者)建议我不要使用自定义插件并使用默认的 ImageResizingModule。
如何在利用 ImageResizer 的同时维护我的 URL api(在查询字符串中使用 id)?
编辑:
这就是我开发自己的插件的方式
public class MyImageResizerPlugin : IPlugin, IQuerystringPlugin, IVirtualImageProvider
{
private IVirtualFile _imageVirtualFile;
public IPlugin Install(Config c)
{
c.Plugins.add_plugin(this);
return this;
}
public bool Uninstall(Config c)
{
c.Plugins.remove_plugin(this);
return true;
}
public bool FileExists(string virtualPath, NameValueCollection queryString)
{
if (!virtualPath.ToLower().Contains("imagehandler"))
{
return false;
}
_imageVirtualFile = new ImageLocalFile(queryString);
return _imageVirtualFile.VirtualPath != null;
}
public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString)
{
return _imageVirtualFile;
}
public IEnumerable<string> GetSupportedQuerystringKeys()
{
return new [] { "id", "width", "height" };
}
public class ImageLocalFile : IVirtualFileWithModifiedDate, IVirtualFileSourceCacheKey
{
private readonly ResizeSettings _query;
private readonly int id;
public ImageLocalFile(NameValueCollection q)
{
_query = new ResizeSettings(q);
id = _query.get("id", 0);
VirtualPath = path of file based on id
}
public Stream Open()
{
return new FileStream(VirtualPath, FileMode.Open, FileAccess.Read);
}
public string VirtualPath { get; private set; }
public DateTime ModifiedDateUTC
{
get
{
return File.GetCreationTimeUtc(VirtualPath);
}
}
public string GetCacheKey(bool includeModifiedDate)
{
return VirtualPath +
PathUtils.BuildQueryString(NameValueCollectionExtensions.Keep(_query, "id", "width", "height"));
}
}
}
这就是我在 web.config
<modules>
<add name="ImageResizingModule" type="ImageResizer.InterceptModule" />
</modules>
<rewrite>
<rules>
<rule name="ImageHandler">
<match url="^imagehandler.*" />
<action type="Rewrite" url="imagehandler.jpg" />
</rule>
</rules>
</rewrite>
<resizer>
<plugins>
<add name="ImageUtilities.MyImageResizerPlugin" />
</plugins>
<clientcache minutes="10080" />
</resizer>
一个。 URL重写。如果您有低延迟查找 table,您可以处理 Config.Current.Rewrite
事件并更改实际正在加载的文件。
乙。继承自 BlobProviderBase 并自行处理 I/O。如果图像不在本地存储中,这可能是一个选项。看来您在这条路径上遇到了麻烦,但拒绝显示任何源代码。也许通灵者可以介入并帮助解决这个问题?
任何插件安装一次。因此,您不应将 _imageVirtualFile 存储在插件的私有字段中。在 GetFile() 方法中评估 _imageVirtualFile。
我正在使用 ImageResizer,而客户端查找具有以下格式的图像:http://website/imagehandler.aspx?id=120&width=240&height=300 这是使用文件夹层次结构寻址图像的另一种方式,因为我使用 id 来查找图像位置。
以前,我为我的使用案例编写了一个自定义插件,但我在该解决方案中遇到了一些线程安全问题,如下所述:imageresizer-shows-wrong-image。 Nathanael(图像缩放器的开发者)建议我不要使用自定义插件并使用默认的 ImageResizingModule。
如何在利用 ImageResizer 的同时维护我的 URL api(在查询字符串中使用 id)?
编辑:
这就是我开发自己的插件的方式
public class MyImageResizerPlugin : IPlugin, IQuerystringPlugin, IVirtualImageProvider
{
private IVirtualFile _imageVirtualFile;
public IPlugin Install(Config c)
{
c.Plugins.add_plugin(this);
return this;
}
public bool Uninstall(Config c)
{
c.Plugins.remove_plugin(this);
return true;
}
public bool FileExists(string virtualPath, NameValueCollection queryString)
{
if (!virtualPath.ToLower().Contains("imagehandler"))
{
return false;
}
_imageVirtualFile = new ImageLocalFile(queryString);
return _imageVirtualFile.VirtualPath != null;
}
public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString)
{
return _imageVirtualFile;
}
public IEnumerable<string> GetSupportedQuerystringKeys()
{
return new [] { "id", "width", "height" };
}
public class ImageLocalFile : IVirtualFileWithModifiedDate, IVirtualFileSourceCacheKey
{
private readonly ResizeSettings _query;
private readonly int id;
public ImageLocalFile(NameValueCollection q)
{
_query = new ResizeSettings(q);
id = _query.get("id", 0);
VirtualPath = path of file based on id
}
public Stream Open()
{
return new FileStream(VirtualPath, FileMode.Open, FileAccess.Read);
}
public string VirtualPath { get; private set; }
public DateTime ModifiedDateUTC
{
get
{
return File.GetCreationTimeUtc(VirtualPath);
}
}
public string GetCacheKey(bool includeModifiedDate)
{
return VirtualPath +
PathUtils.BuildQueryString(NameValueCollectionExtensions.Keep(_query, "id", "width", "height"));
}
}
}
这就是我在 web.config
<modules>
<add name="ImageResizingModule" type="ImageResizer.InterceptModule" />
</modules>
<rewrite>
<rules>
<rule name="ImageHandler">
<match url="^imagehandler.*" />
<action type="Rewrite" url="imagehandler.jpg" />
</rule>
</rules>
</rewrite>
<resizer>
<plugins>
<add name="ImageUtilities.MyImageResizerPlugin" />
</plugins>
<clientcache minutes="10080" />
</resizer>
一个。 URL重写。如果您有低延迟查找 table,您可以处理 Config.Current.Rewrite
事件并更改实际正在加载的文件。
乙。继承自 BlobProviderBase 并自行处理 I/O。如果图像不在本地存储中,这可能是一个选项。看来您在这条路径上遇到了麻烦,但拒绝显示任何源代码。也许通灵者可以介入并帮助解决这个问题?
任何插件安装一次。因此,您不应将 _imageVirtualFile 存储在插件的私有字段中。在 GetFile() 方法中评估 _imageVirtualFile。