2012-02-21 104 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

不知道爲什麼會永遠想這樣做(存儲在會話文件),因爲如果你有很多用戶上傳的他們的文件在同一時間,將這些文件存儲在您的網絡服務器的內存中,特別是如果這些文件很大,不會使該服務器持續很長時間。將文件存儲到文件系統是推薦的方法。

但無論如何,這裏是你如何能做到這一點(假設你沒看過或關心我以前的話):

[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); 
} 

其中的視圖模型文件屬性是HttpPostedFileBase。接下來,你可以有一個控制器動作,這將成爲本文件:

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

,並在視圖中,您將有一個<img>標籤指向這個動作:

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

當然現在的AjaxUpload plugin讓你使用AJAX上傳文件,所以你不需要重新加載整個頁面。因此,在這種情況下,您的控制器操作可以簡單地返回一個JSON對象,以指示上載過程是否成功,然後在成功回調中將<img>標記的src屬性設置爲將爲該文件提供服務的控制器操作。

+0

謝謝。我明白你的意思。如果用戶上傳圖片僅用於預覽(因此可以隨時上傳其他圖片以放棄他們當前擁有的圖片),您是否建議將圖片存儲在文件系統或數據庫中? – Paul 2012-02-21 23:20:59

+0

抱歉提出一個死的線程,但是,我會如何將圖像存儲到文件系統?我在這裏看到了很多關於它的線索,但沒有解釋如何。我應該爲那個(或網站)創建另一個子域名嗎?如果是這樣,我如何才能從我的原始網站服務器訪問?因爲他們說它不應該訪問主文件或類似的東西? – gdubs 2012-07-01 14:03:31

1

一些示例代碼。將其修改爲任何你想做的事情。如果很多用戶將圖像投入到會話中,這不是一個好主意。如果短暫存在,或者長期存在,更好地將其存入數據庫中,則可以使用更永久的存儲(也許是文件系統)。

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., 
    } 

希望這會有所幫助。