将查询字符串转换为文件名 - 最佳做法?

时间:2010-12-02 09:33:05

标签: asp.net query-string filenames

我有一个处理程序(c#/ asp.net)从数据库中提取图像。 当前格式如foo.com/_image.ashx?querystring1&querystring2 查询字符串键是id,width,zoom level等。

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

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

3 个答案:

答案 0 :(得分:2)

最简单的解决方案是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));

答案 1 :(得分:1)

最佳做法是一件棘手的事情,你想要做出的很多选择取决于你的情况。

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

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

在服务器上托管图像有许多优点,而不是像_images.ashx那样传递数据。就你上面提到的网址而言,它们几乎都是一样的。除非你想要从中获得seo价值,否则它并不重要。网址取决于您的效果/缓存/搜索目标等目标。

希望这会有所帮助。 标记

答案 2 :(得分:0)

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

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

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

Base64编码: QzpcaW1hZ2VzXG15aW1hZ2UucG5n

如果你想保持网址简短,并且你想确保根据上面的解决方案文件名是正确的,你应该只使用文件名本身。 base64编码版本不会为您带来任何好处。

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

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