2010-12-02 12 views
1

私はデータベースから画像を取り出すハンドラ(c#/ asp.net)を持っています。 現在のフォーマットはfoo.com/_image.ashx?querystring1&querystring2 キーは、私は、ファイル名にこれをアップのmungeするか等ID、幅、ズームレベルクエリ文字列をファイル名に変換する - ベストプラクティスですか?

ようなもの(すなわちfoo.com/id__999_w__128__h__200.jpg)であるクエリ文字列、または全体のURL構造(即ちfoo.com/id/999/w/128/h/200/image.jpg)のように見えます。

私はネット上でこの練習の記事や議論があるように見えないので、他の人がこの状況で与えてくれるものを見ることに興味がありました。

答えて

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)); 
+0

素晴らしいアイデアは、URLをかなり短くします! – maxp

+0

警告! Base64は認識可能なエンコーディングです。どんな技術にも精通したユーザーは、それを見つけて新しいものを見つけることができます。あなたはそれを浄化しなければなりません(例のための道で '..'を探してください)。あなたはbase64でそれをエンコードする前にいくつかのxorアルゴリズムでそれを暗号化するほうがいいです。 –

+0

@Nicolasさらに簡単に言えば、データベース行に関連するクエリ文字列のuidを置くだけです。 –

1

ベストプラクティスは難しいことであり、状況に応じて選択することがたくさんあります。

今日、これを処理する良い方法は、イメージをデータベースに格納するのではなく、Amazon S3のようなサーバーにロードすることです。 Amazon S3にはプログラム可能なAPIがあります。そのため、既に書き込んだアプリケーションをデータベースに保存することで、Amazon S3にアップロードすることができます。次に、あなたのデータベースにイメージのURLを保存します。

これは、多くの問題を解決します。
1. Amazon S3に保存されている画像は、Amazon CloudFront(CDN)に公開されており、インターネット経由で可能な限り迅速な経路で画像データをエンドユーザにルーティングするのに役立ちます。 2.これらのイメージに期限切れヘッダーを適用してクライアントブラウザにキャッシュできるようにすると、Webサイトの使用中に最適なパフォーマンスが得られます。あなたのcurrenのメカニズムでは、これらのヘッダーをプログラムで追加する必要があります。 3.データベースに対してブロブ・データをプルすることは、データベースに対して最もパフォーマンスの高い操作ではありませんでしたので、このコードを完全に削除することができます。 4.不要なCookieの受け渡しが防止されるように、これらの画像にCookieフリーのドメイン名を適用することができます。また、ユーザーのパフォーマンスがわずかに向上します。たとえば、www.mysite.comにあなたのウェブサイトをホストすることができます。あなたのイメージにはimages.mysitestatic.comという名前を付けることができます。この方法で、mysitestatic.comドメイン名にあなたのユーザーは各リクエストでアップロードしてダウンロードする必要があります。

_images.ashxのようにデータを渡すのではなく、サーバーにイメージをホストすることには多くの利点があります。あなたが上に示したURLまでは、どちらもほぼ同じです。あなたがそれからSEOの価値を得ることを望んでいない限り、それは本当に重要ではありません。 URLは、パフォーマンス/キャッシング/ SEOなどの目標に応じて異なります。

マーク

+0

ありがとう、そこには興味深い考えがあります。あなたはブログを始める必要があります!ポイント#2と#4はすべてのcdnの特徴であり、このquerystring - > filename操作の背後にあるポイントは、毎回データベースから取得するのではなく、ローカルファイルシステムにイメージを保存できるようにすることです(最初の実行時に、基本は問題ありません)、その点は#3です。私はAmazonがその(国際的な)流通、価格設定モデル、APIに優れていると思います。 – maxp

0

申し訳ありませんが、これは初めてですが、私は上記の答えにコメントしたいと思います。

URLをエンコードするBASE64で何を得るのか分かりませんか? URLを短くしても、base64でエンコードされた文字列は通常約33%長くなります。

例は次のとおりです。 C:\ images \ myimage。エンコード

Base64でのpng:あなたは短いURLを維持したい、とあなたはファイル名が上記のソリューションごとに正しいことを確認したい場合は QzpcaW1hZ2VzXG15aW1hZ2UucG5n

して、あなただけのファイル名自体を使用する必要があります。 base64でエンコードされたバージョンは、あなたに何らかの利点を提供していません。

しかし、私はこれがあなたのデータベースソリューションにはまったく関係していないため、あなたに役立つとは思えません。あなたは、データベース内のフィールドに「画像/ myimage.png」を記憶して、URLの外観を持っていた場合を除き、次のように:それとワット foo.com/images/image.jpg?h=5 & = 10

フォーマットでは、要求されているリソースの名前は、高さ5、幅10のイメージの表示から切り離されています。

関連する問題