2017-08-29 5 views
-3

{sku_number} .jpgのようなWebサーバー上に画像があります。今私は、{sku_number} foo.jpgのように、この画像のファイル名をWebサーバ上のファイルの名前を変更せずにすべての訪問者に持たせたいと考えています。余分な情報を持つ画像の仮想パスを設定する

は、これを可能とする方法ですか?

+0

ファイルの例をWebサーバーに保存する方法と、同じファイルをWebでどのように見せたいかを追加できますか? –

+0

123456789.jpgのようなものです。私は123456789_TitleOfTheProduct.jpgを持っています。しかし、私はタイトルがフォンの時間を変更することができるすべてのファイルの名前を変更したくありません。私はこのファイル名を "仮想"にしたいと思います。 –

答えて

0

私が正しくあなたを理解している場合のいずれかのオプションは、system.webServerでweb.configファイルに登録するとHTTP Handler

public class ImageHttpHandler : IHttpHandler 
{ 

    public bool IsReusable 
    { 
     get { return false; } 
    } 
    protected RequestContext RequestContext { get; set; } 

    public void ProcessRequest(HttpContext context) 
    { 
     AdvertType type; 
     var url = context.Request.Url.ToString(); 
     //TODO: get ID and extension from url 123456789_TitleOfTheProduct.jpg 
     var path = "yourpathtoimgfolder/id.extension" 
     //Get binary data 

     context.Response.ContentType = "image/png"; 
     context.Response.BinaryWrite(bytes); 
    } 
} 

だろう - >ハンドラ

<add name="YourName" verb="*" path="virtual/folder/*" type="Namespace.ImageHttpHandler, Your.Assembly.With.Handler, Version=1.0.0.0, Culture=neutral" preCondition="managedHandler" /> 
+0

これはソリューションの片側にしか見えません。要求が出されたら、ディスク上の物理ファイルを見つけなければなりません。しかしこれはimg-Tagに正しいURLを得るための解決策ではありません。 –

0

Reference

Url.Contentヘルパーメソッドは、avあなたのファイルへの仮想コンテンツのパスとあなたのサイト内のファイルにアクセスするためのURLを返します。あなたはそれに物理ディレクトリの場所を渡すべきではありません。

あなたのウェブアプリケーションに画像を保存することを検討することがあります。 "Images"という名前のディレクトリを作成すると、Url.Contentメソッドを安全に使用できます。

例えば、

@foreach (var imgPath in Directory.GetFiles(Server.MapPath(Url.Content("~/Images/")))) 
{ 
    <img src="@Url.Content("~/Images/"+ @Path.GetFileName(imgPath))" /> 
} 

それとも、絶対に、アプリのルート外のどこかに画像を保存する必要がある場合(例:「C:\ tempに\画像またはネットワーク上の場所)、あなたはANの作成を検討かもしれませんファイル名を取るアクションメソッド、場所からファイルを読み込み、画像として返す。

public ActionResult GetImg(string id) 
{ 
    var path = [email protected]"C:\temp\images\{id}.png"; 
    var bytes = System.IO.File.ReadAllBytes(path); 
    return File(bytes, "image/png"); 
} 

今、あなたは、単に、このエンドポイントを呼び出し、画像のsrcプロパティとしてそれを使用する必要があります。

@foreach (var imgPath in Directory.GetFiles(@"C:\temp\images", "*.*")) 
{ 
    <img src="@Url.Action("GetImg",new {id=Path.GetFileNameWithoutExtension(imgPath)})" /> 
} 

上記は単純な解決方法で、ハードコードしてpngファイルを返す方法です。

注:個人的には、剃刀ファイルに最小限のC#を保存することを好みます。私はC#コード(すべてのDirectory.GetFiles行)をGETアクションに移動し、ビューモデル/ビューバック(必要に応じて)を介してビューにイメージ名のリストを渡すのが好きです。

+0

あなたの最初の解決策は動作しません。私はディスクにファイルを必要としません。 –

0

このような要求を処理する簡単なコントローラを作成できます。

[RoutePrefix("products/images")] 
public class ProductImagesController : Controller { 
    [HttpGet] 
    [Route("{sku_number:long}_{title}.{extension}", Name = "ProductSkuImage")]//Matches GET products/images/123456789_TitleOfTheProduct.jpg 
    public ActionResult Get(long sku_number, string title, string extension) { 
     var fileStorePath = Server.MapPath("~/images"); 
     var fileName = string.Format("{0}.{1}", sku_number, extension); 
     var path = Path.Combine(fileStorePath, fileName); 
     if (System.IO.File.Exists(path)) { 
      var mimeType = MimeMapping.GetMimeMapping(fileName); 
      var downloadName = string.Format("{0}_{1}.{2}",sku_number,title,extension); 
      return File(path, mimeType, downloadName); 
     } 
     return HttpNotFound(); 
    } 
} 

単純な自己説明的な例として、上記をリファクタリングしてより柔軟にすることができます。たとえば、ディスクからファイルを読み込む代わりに、skuを使用してデータベースやWebサービスのような別のデータストアからファイルを取得することができます。ビュー

<a href="@Url.RoutUrl("ProductSkuImage", new { sku_number=123456789 , title = "TitleOfTheProduct" , extension="jpg" })" >TitleOfTheProduct</a> 

からの呼び出しの

<a href="http://localhost/products/images/123456789_TitleOfTheProduct.jpg">TitleOfTheProduct</a>  
+0

有望そうです。私はこれを最初に試してみましょう。 img-Tagの正しいURLを取得できますか? –

+0

@TimurZanagarチェックの例が – Nkosi

1

を生成する私はそれが適切にまだにWebサーバーを許可します、元の画像に偽装された画像から302を返すことをお勧めしますアセットがキャッシュされるのは、アセットが要求されるたびに、ファイルシステムの読み込み/書き込みを実際に非効率的に実行することではありません。NETレベルでありながら、スプーフィングされたパスでDOM内のパスをマスクします(ただし、問題が発生した場合は元のパスが表示されます)。

302があなたの特定のニーズに対応できることを確認します。

それ以外の場合は、基本的にアセットキャッシングのIISパイプラインをエミュレートしたい場合があります。

+0

に追加されましたこれはうまくいかないでしょう。この変更はSEOの目的のためです。 GoogleのSEOユーザーとGoogle Imageのドキュメントでは、altタグでなく、画像ファイルに商品のタイトルを指定する必要があると述べています。 –

+0

OKはそこに目的について興味がありました - ええ301は名前の変更を伴う問題を引き起こし、302は "SEOジュース"を運びません。 以下の他の提案と同様に、読み書きを怠るのではなく、IISのキャッシュ機能を複製することをお勧めします。残念ながら、私はIISがこれを内部的にどのように決定するかを正確には知らないので、同様のキャッシュ設定を提案することはできません。 – StrangeWill

関連する問題