2012-02-21 28 views
1

私はMVC 3を使用しており、AjaxUploadプラグインを使用してAJAXを使用して画像をアップロードしています。ファイルシステムにイメージを保存するのではなく、セッションオブジェクトにイメージを保存してから、ストリームを出力してフォーム上にイメージコントロールを作成したいのですか?誰もこれを行う方法を知っているだろうか?ASP.NET MVC 3プレビュー画像

答えて

1

SomeView.cshtml:

<img src="@Url.Action("/Image/Render")" /> 

ImageController.cs:

public ActionResult Render() { 
    return File((byte[])Session["Avatar"], "image/jpeg") 
} 
4

今まであなたは、ユーザーのアップロードをたくさん持っている場合ので、それは(セッション中にファイルを保存)したいと思う理由は考えそれらのファイルを同時に保存し、それらのファイルをWebサーバーのメモリに格納すると、特にこれらのファイルが大きい場合、このサーバーは非常に長くなりません。ファイルシステムにファイルを格納することをお勧めします。

しかし、いずれにせよ、ここ(あなたが読んだり、私の以前の発言を気にしませんでしたと仮定して)あなたがそれを行うことができる方法です:ビューモデルのファイルのプロパティはHttpPostedFileBase

[HttpPost] 
public ActionResult Upload(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    var buffer = new byte[model.File.InputStream]; 
    model.File.InputStream.Read(buffer, 0, buffer.Length); 
    Session["uploadedFile"] = buffer; 
    return View(model); 
} 

です。

<img src="@Url.Action("image")" alt="" /> 

今のコースAjaxUpload pluginは、あなたがすることができます:

public ActionResult Image() 
{ 
    byte[] buffer = (byte[])Session["uploadedFile"]; 
    return File(buffer, "image/png"); 
} 

がビューにこのアクションを指す <img>タグを持っています。次は、このファイルを提供しますコントローラのアクションを持つことができますAJAXを使用してファイルをアップロードするので、ページ全体をリロードする必要はありません。この場合、コントローラのアクションは単にアップロードプロセスが成功したかどうかを示すJSONオブジェクトを返すだけで、成功コールバックで <img>タグの srcプロパティをファイルを提供するコントローラアクションに設定することができます。

+0

ありがとうございます。私はセッションについてあなたが何を意味するのかを見ます。ユーザーがプレビューのためだけに画像をアップロードしている場合(現在の画像を破棄するためにいつでも別の画像をアップロードすることができます)、ファイルシステムやデータベースに保存することをお勧めしますか? – Paul

+0

デッドスレッドを残して申し訳ありませんが、イメージをファイルシステムに保存するにはどうすればいいですか? iveはここでそれについて多くのスレッドを見ましたが、その方法を説明するものは何もありません。他のサブドメインを作成する必要がありますか?もしそうなら、元のウェブサイトサーバーからどのようにアクセスできますか?彼らはそれがメインファイルやそれに類するものにアクセスできべきではないと言いましたか? – gdubs

1

いくつかのコード例。あなたがやりたいことに変更してください。たくさんのユーザーがいる場合、イメージをセッションにスリングするのは良い考えではありません。短命の場合、または長生きの場合は、より永続的なストレージ(ファイルシステムかもしれません)の場合は、dbに貼り付けるのがよいでしょう。

public ActionResult UploadImage() 
    { 
     foreach (string imageName in Request.Files) 
     { 
      HttpPostedFileBase file = Request.Files[imageName]; 
      if (file.ContentLength > 0) 
      { 
       BinaryReader br = new BinaryReader(file.InputStream); 
       byte[] content = br.ReadBytes(file.ContentLength); 
       Session[imageName] = content; // better to store in a db here 
      } 
     } 
     return View(); 
    } 

    // return the image (controller action) /mycontroller/ViewImage?imageName=whatever 
    public FileStreamResult ViewImage(string imageName) 
    { 
     byte[] content = (byte[])Session[imageName] ; // where ever your content is stored (ideally something other than session) 
     MemoryStream ms = new MemoryStream(content); 
     return new FileStreamResult(ms, "application/octet-stream"); // set content type based on input image, it might be png, jpg, gif etc., 
    } 

希望します。