65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Thumbs.db 缩略图查看器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (7投票s)

2007 年 6 月 5 日

CPOL

4分钟阅读

viewsIcon

83229

downloadIcon

1411

一个 Windows Explorer 风格的 Thumbs.db 网页查看器。

引言

我保存了大量、大量的照片在一个 Web 服务器上,方便访问。几乎我拍过的每一张照片,自从我的 1 兆像素摄像头。想象一下。一整个,巨大的兆像素。总之,要看照片就得点击每个文件名,这很麻烦,而且查找特定照片非常耗时。我确实使用 nGallery(现在是 Community Server 的一部分)来托管一些我感兴趣的相册。但管理近 10,000 张照片会非常繁琐。而且,我不需要为每张照片都创建一个花哨的网页。Windows Explorer 的缩略图视图很棒(大部分情况下),我希望在离家时能在我的浏览器中看到同样的效果。

所以前几天,当我再次发现自己一张一张地翻看照片时,我偶然看到了 Thumbs.db 文件。它可能在你的大多数电脑上都是隐藏的。出于某种原因,我更改了文件夹视图设置,这个文件引起了我的注意。我知道它是什么,并且知道它是在我切换到缩略图视图时创建的,但不知道它是如何工作的,里面究竟有什么。我做了一些 Google 搜索,发现它是一个 IStorage - COM 结构化存储文件。只有低级 API 才能访问它。.NET 没有直接访问它的方法,所以导入 COM 库是处理它的唯一途径。再 Google 一下,我找到一个 .NET 库,它正好可以做到这一点 - ThumbDBLib - 一个用于读取 thumbs.db 文件的 C# 库。这正是我想要的。几个小时后,我就拥有了我一直想要的东西!一个适用于我所有照片的 Explorer 风格的 Web 缩略图查看器……太棒了!

非常感谢 Pete Davis 提供的 ThumbDBLib - 一个用于读取 thumbs.db 文件的 C# 库。请到 Pete 的网站查看源代码以及关于他的库如何工作的相关信息。Pete,做得好!

之前……

之后……是不是更好?

代码

以下代码位于 thumbs.aspxPage_Load 事件中。下载示例应用程序以获取完整列表。ASPX 页面有一个单独的 Placeholder 控件,其中添加了 System.Web.UI.WebControls.Image 控件。为 Thumbs.db 文件中找到的每个缩略图添加一个 Image 控件。这会导致在最终 HTML 中渲染一系列 <img src...> 标签。然后客户端 Web 浏览器会回调到 thumbs.aspx,并以 <img src="thumbs.aspx?thumb={filename}" ...> 的形式请求每个图像。缩略图将从 Thumbs.db 中检索并返回给客户端。就这样!

Dim ThumbDb As String = Server.MapPath(".") & "\thumbs.db"
If File.Exists(ThumbDb) Then

    Dim ThumbLib As New ThumbDBLib.ThumbDB(ThumbDb)

    ' Is an individual image being requested?
    If Not Request.QueryString("thumb") Is Nothing Then

        ' Get the thumbnail byte array...
        Dim Thumb As String = Request.QueryString("thumb")
        Dim ThumbData As Byte() = ThumbLib.GetThumbData(Thumb)

        ' Send it to the client...
        Response.Clear()
        Response.ContentType = "image/" & _
           Path.GetExtension(Thumb).ToLower.Replace(".", "")
        Response.BinaryWrite(ThumbData)
        Response.Flush()
        Response.End()

    Else
        ' 1. Get the list of thumb's
        For Each thumb As String In ThumbLib.GetThumbfiles
            ' NOTE: The thumbs.db may have thumbnails of other items such as folders.
            ' The thumb is viewable (uncomment the File.Exists statement below), 
            ' but will not exist as an actual image.
            If File.Exists(Server.MapPath(".") & "\" & thumb) Then

                ' 2. Create an Image for each thumb and set properties...
                ' Could use a Literal control here if you want more 
                ' control over the html.
                Dim ThumbImage As New System.Web.UI.WebControls.Image

                ThumbImage.ImageUrl = "thumbs.aspx?thumb=" & Server.UrlEncode(thumb)

                ThumbImage.ImageAlign = ImageAlign.Top
                ThumbImage.AlternateText = thumb
                ThumbImage.BorderStyle = BorderStyle.Outset
                ThumbImage.BorderWidth = New Unit(1)
                ThumbImage.Attributes.Add("hspace", "4")
                ThumbImage.Attributes.Add("vspace", "4")
                ThumbImage.Attributes.Add("onclick", "window.location.href='" & thumb & "';")
                ThumbImage.Style.Add("cursor", "hand")

                ' 3. Add the image to the page. This renders
                '    an <img src="thumbs.aspx?thumb={filename}">
                '    for each thumbnail. When the html gets
                '    to the client, each image is requested and
                '    this page returns the image directly
                '    through the Response stream (code above.)
                plcThumbs.Controls.Add(ThumbImage)

            End If
        Next

    End If
    ThumbLib = Nothing
Else
    Response.Write("Thumbs.db Not Found!")
End If

值得关注(或不值得关注)的点

  1. 上面的例子有一个明显的缺点。如果你将照片组织到很多单独的文件夹中,你必须在每个文件夹中放置一个缩略图查看器的副本。这很麻烦。解决方法很简单:一个 IHttpHandlerIHttpModule 可以很好地处理这个问题。只会存在一个 thumbs.aspx 文件,但对它的请求会被 Handler 或 Module 捕获并针对任何目录进行处理。
  2. 另一个(大的)缺点是,Thumbs.db 文件需要手动生成。你需要从 Windows Explorer 中切换到缩略图视图。我还没有找到一种方法可以从代码中调用 Thumbs.db 的创建。我确定有办法。如果有人知道如何做,请给我发邮件,我会更新这篇文章。
  3. 我不知道如何关闭 ThumbDbLib 打开的 Thumbs.db 文件。该文件仍然被 aspnet(或 w3wp)工作进程使用,无法删除。你需要杀死工作进程才能释放文件。同样,我确信有解决方案,我只是还没有时间去寻找它。它可能就在我眼前!
  4. 不确定为什么某些缩略图的顶部/底部会有空白。很可能有充分的理由,但这并不真正困扰我。

除了 Pete 的 ThumbDbLib,以下文章也包含了一些有用的信息

要设置演示项目,请解压缩 zip 文件并在 IIS 中创建一个指向 ThumbsDbViewer 目录的虚拟目录。它已经预编译,应该可以在没有 Visual Studio 的情况下运行。

我知道,我知道。这篇文章留下了一些未解答的问题和许多未完成的事情。我写它只是为了演示一个概念。我欢迎所有建设性的反馈,并很想了解更多我知之甚少的事情。继续编码……

历史

  • 2007-06-05:初次创建。
© . All rights reserved.