【问题标题】:Converting querystring to filename - best practise?将查询字符串转换为文件名 - 最佳实践?
【发布时间】:2010-12-02 09:33:05
【问题描述】:

我有一个从数据库中提取图像的处理程序 (c#/asp.net)。 当前格式看起来像foo.com/_image.ashx?querystring1&querystring2 查询字符串键是 id、宽度、缩放级别等。

我可以将它转换成一个文件名(即foo.com/id__999_w__128__h__200.jpg),或一个完整的网址结构(即foo.com/id/999/w/128/h/200/image.jpg)。

我很想看看其他人在这种情况下会怎么做,因为网上似乎没有任何关于这种做法的文章或讨论。

【问题讨论】:

    标签: asp.net query-string filenames


    【解决方案1】:

    最简单的解决方案是base64 文件名,那么您几乎可以保证文件名每次都是正确的,并且不会被篡改或损坏。

    string filename = @"C:\images\myimage.png";
    
    // You may need to change the Encoding type here
    string converted = Convert.ToBase64String(
        System.Text.Encoding.Default.GetBytes(filename));
    

    【讨论】:

    • 好主意,大大缩短了网址!
    • 警告! Base64 是一种非常可识别的编码。任何精通技术的用户都将能够找到它并打造新的。您必须对其进行清理(例如,在路径中查找 ..)。你最好先用一些异或算法加密它,然后再用 base64 编码。
    • @Nicolas 或者更简单,只需将查询字符串中的 uid 放入与数据库行相关的查询字符串中
    【解决方案2】:

    最佳实践是一件棘手的事情,您要根据自己的情况做出很多选择。

    今天解决这个问题的一个好方法是将图像加载到像 Amazon S3 这样的服务器中,而不是将它们存储到您的数据库中。 Amazon S3 有一个您可以编程的 api,因此您已经编写的将图像存储到数据库中的应用程序可以调整为将它们上传到 Amazon S3。然后你将把图片的url存储到你的数据库中。

    这将解决许多问题。
    1. 存储在 Amazon S3 上的图像可以在作为 CDN 的 Amazon CloudFront 上公开,它将帮助您通过 Internet 以尽可能快的路线将图像数据路由到最终用户。 2. 您可以将过期标头应用于这些图像,以便它们缓存在客户端浏览器上,用户在使用您的网站时将获得最佳性能。在您当前的机制中,您必须以编程方式添加这些标头。 3. 将 blob 数据拉入和拉出数据库从来都不是针对数据库的最高性能操作,因此您可以完全摆脱这些代码。 4. 您可以为这些图像应用一个无 cookie 的域名,这样可以防止不必要的 cookie 传递,并且也会为您的用户带来轻微的性能提升。例如,您可以在 www.mysite.com 上托管您的网站,您可以为您的图片指定名称 images.mysitestatic.com,这样您就知道您的 mysitestatic.com 域名上没有任何 cookie用户需要在每个请求上上传和下载。

    与像 _images.ashx 这样的数据传递相比,在服务器上托管图像有很多优势。就您上面提供的网址而言,它们几乎相同。除非您希望从中获得 seo 价值,否则这并不重要。 url 取决于您的性能/缓存/seo 等目标。

    希望这会有所帮助。 标记

    【讨论】:

    • 谢谢马克,有一些有趣的想法。你应该开始一个博客!第 2 点和第 4 点是任何 cdn 的功能,并且此查询字符串 -> 文件名操作背后的要点是,图像可以存储在本地文件系统上,而不是每次都从数据库中检索(在第一次运行时进行 -基础很好),所以这是第 3 点。我认为亚马逊在其(国际)分销、定价模式和 api 方面表现出色(尽管我没有这方面的个人经验。
    【解决方案3】:

    对不起,我是新手,但我想对上面的答案发表评论。

    我不明白您通过 BASE64 编码网址获得了什么?它不会使 url 缩短,base64 编码的字符串通常会长 33% 左右。

    这是一个例子: C:\images\myimage.png

    Base64 编码: QzpcaW1hZ2VzXG15aW1hZ2UucG5n

    如果您想保持 url 简短,并且您想确保文件名根据上述解决方案是正确的,您应该只使用文件名本身。 base64 编码版本对您没有任何好处。

    虽然,我不确定这是否对您有帮助,因为它与您的数据库解决方案完全无关。除非您将“images/myimage.png”存储在数据库的某个字段中,并且您的 url 如下所示: foo.com/images/image.jpg?h=5&w=10

    使用该格式,被请求资源的名称与高度为 5 和宽度为 10 的图像表示分离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多