7

次のURLを使用してサイズ変更された画像を取得できるように、動的なサムネイルリサイザーを作成したいと思います。

http://server/images/image.jpg?width=320&height=240

次のようなルートを設定してみました。

routes.MapRoute(null,
                "{filename}",
                new { controller = "Image", action = "Resize" });

ただし、ファイルがURLに存在する場合、ASP.NETはルーティングをバイパスし、代わりにファイルのみを返します。ディスク上にあるものを返すのではなく、ASP.NETにイメージをルーティングさせるにはどうすればよいですか?

4

5 に答える 5

4

これを行うためにアクションを使用しないのはなぜですか?コントローラのアクションにより、画像をストリーミングバックできます。それ以外の場合、たとえばASPXの場合の一般的な方法は、ハンドラーまたはハンドラーファクトリがファイル拡張子をリッスンし、それに応じて処理することです。または、URL書き換えを使用して、リクエスト内のURLを書き換えます。

于 2010-12-18T02:02:19.797 に答える
3

それがasp.netルーティングの仕組みであり、それを回避することはできません...既存のファイルの要求をインターセプトする場合は、Rewriteを使用する必要があります。

アップデート

私はそこでのトリガーで少し速すぎたようです。既存のファイルに対してもルートを適用できるように設定できるプロパティがあるようです。

RouteCollection.RouteExistingFilesプロパティ

http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx

ASP.NETルーティングが既存のファイルと一致するURLを処理する必要があるかどうかを示す値を取得または設定します。ASP.NETルーティングが、既存のファイルと一致するものも含め、すべての要求を処理する場合はTrue。それ以外の場合はfalse。デフォルト値はfalseです。

于 2010-12-18T02:01:11.427 に答える
2

次のことも検討できます。

  1. ルーティングに到達する前にこれらのイメージ ルートを処理するモジュールを作成する (Web.Config に登録)
  2. これらの画像を処理するために、独自のルート ハンドラーを作成します。

どちらもコントローラーとして書く必要をなくすことができます。これはよりクリーンだと思います。

独自のルート ハンドラーの非常に基本的な例 (メモリから)...

通常のルートとして登録します。

/* Register in routing */
routes.Add("MyImageHandler",
           new Route("my-custom-url/{folder}/{filename}", 
           new ImageRouteHandler())
);


/* Your route handler */
public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string filename = requestContext.RouteData.Values["filename"] as string;
        string folder = requestContext.RouteData.Values["folder"] as string;
        string width = requestContext.HttpContext.Request.Params["w"] as string;
        string height = requestContext.HttpContext.Request.Params["h"] as string;

        // Look up the file and handle and return, etc...
    }
}

これらが役立つことを願っています。拡張して達成する方法はたくさんあります:)

于 2012-02-22T10:03:53.780 に答える
1

最も簡単な方法は、コントローラーを介してすべての画像をルーティングし、画像を別の場所に保存することです

routes.MapRoute("Images",
            "/images/{filename}",
            new { controller = "Image", action = "Resize" });

/sitebase/images/image.jpg         //public image location
/sitebase/content/images/image.jpg //real image location

次に、コントローラーはどのイメージが要求されているかを確認し、ファイル システムから適切なファイルをロードします。これにより、特別な処理をしなくても、やりたいことを実行できます。

于 2010-12-18T05:49:19.497 に答える
0

どうですか:

routes.MapRoute("Images",
        "/images/{filename}.jpg",
        new { controller = "Image", action = "Resize" });

拡張子が .jpg の URL のみがそのルートに一致し、適切にルーティングされるようにする必要があります。

また、デフォルトのアクションを最後に追加して、最も具体的なものから最も具体的でないものの順にアクションを追加することを忘れないでください。

もちろん、アクションは filecontentresult を使用して画像を提供する必要があります。

于 2011-07-02T13:34:48.710 に答える