将ImageResizer与自定义查询字符串一起使用

时间:2015-09-05 06:39:34

标签: imageresizer

我在使用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>

2 个答案:

答案 0 :(得分:1)

任何插件都安装一次。因此,您不应将_imageVirtualFile存储在插件的私有字段中。在GetFile()方法中评估_imageVirtualFile。

答案 1 :(得分:0)

一个。 URL重写。如果您有一个低延迟查找表,则可以处理Config.Current.Rewrite事件并更改实际加载的文件。

B中。从BlobProviderBase继承并自己处理I / O.如果图像不在本地存储上,则可能是一种选择。您似乎遇到了这条路径的问题,但拒绝显示任何源代码。也许一个通灵者可以介入并帮助这个?