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

적 사용자 업로드를 많이있는 경우 때문에 그 (세션에서 파일을 저장)하고 싶은 이유 없음 아이디어 동시에 해당 파일을 웹 서버의 메모리에 저장하면 특히이 파일이 큰 경우이 서버를 오래 사용할 수 없습니다. 파일 시스템에 파일을 저장하는 것이 좋습니다.

어쨌든, 여기에 (읽거나 내 이전 발언에 대해 걱정하지 않은 가정) 당신이 그것을 할 수있는 방법은 다음과 같습니다 뷰 모델에서 파일 속성은 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., 
    } 

희망이 있습니다.