2013-04-28 2 views
0
내가 ASP MVC4을 가진 파일을 업로드하기 위해 노력하고있어

, 난 당신에게 내 상황 제공 : 나는 모델 클래스 일부 부가 요소로 "영화는"(중요하지 않음)이파일 업로드 ASP MVC 4.0

  • 이미지를 모델과 다르게 만들기 위해 모델을 터치하지 않고 컨트롤러 및 뷰 파트에 코드를 추가하고 싶습니다.

그래서, 여기에 내보기 코드의 예입니다, 내가 굵은 선은 나에 의해 추가 된 것 :

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Movie</legend> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Duration) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Duration) 
     @Html.ValidationMessageFor(model => model.Duration) 
    </div> 

//ADDED BY ME: 
    <div class="editor-label"> 
     <p>Select a file</p> 
    </div> 

    <div class="editor-field"> 
     <input type="file" name="fileUpload" /> 
    </div>//END OF MY CODE 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

그래서 당신은 내가 나를 추가 할 수 있습니다 ASP에 의해 생성 된 일부 코드를 볼 수 있습니다 db에 새로운 사용자, 이미지 업로드를 위해 추가 한 "input".

문제는 컨트롤러에서 이미지를 복구하려고 할 때 "Request.Files"atributte가 비어있어 이미지를 복구 할 수 없으며 물론 업로드 할 수 없다는 것입니다. 컨트롤러 코드 :

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Movie movie) 
    { 
     if (ModelState.IsValid) 
     { 
      db.MovieContext.Add(movie); 
      db.SaveChanges(); 
      foreach (string file in Request.Files) 
      { 
       var postedFile = Request.Files[file]; 
       postedFile.SaveAs(Server.MapPath("~/UploadedFiles") + pelicula.Id); 
      } 
      return RedirectToAction("Index"); 
     } 

     return View(movie); 
    } 

아래 시도 누군가가 나를 도울 수 있다면 그것은 좋은 것 때문에 "Request.Files는"비어있는 이유를 알고 당신에게

답변

3

너무 감사하지 마십시오

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Movie movie, HttpPostedFile fileUpload) 
{ 
    if (ModelState.IsValid) 
    { 
     db.MovieContext.Add(movie); 
     db.SaveChanges(); 

     var postedFile = fileUpload; 
     postedFile.SaveAs(Server.MapPath("~/UploadedFiles") + pelicula.Id); 

     return RedirectToAction("Index"); 
    } 

    return View(movie); 
} 
+0

죄송합니다 사용하고 있습니다 : 짧은 문제에 내가 여기

enctype = "multipart/form-data" 전체 코드입니다 내 양식에 대한 인코딩을 지정 didnt는 것을 위해이었다 대답. 짧은 시간에. fileUpload는 Create (Movie 무비, HttpPostedFile fileUpload)의 fileUpload에 바인드해야합니다. 그럼 너의 마술을해라. – Antevirus

+0

이것이 왜 작동할까요? 보기에서 뭔가를 만져야합니까? 지금 당장 시험해 보겠습니다.) – Santanor

+0

두 번째 매개 변수와 줄을 추가하면 죄송합니다. 작동하지 않습니다. "if"modelState.IsValid가 동일합니다. false로 설정하면 내 마법이 실행되지 않습니다. P – Santanor

1

우리는 무엇이 잘못되었는지 찾아 낼 수 있는지 살펴 봅니다. 다음을 시도해보고 오류를 보여주십시오 :

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Movie movie, HttpPostedFile fileUpload) 
{ 
    if (ModelState.IsValid) 
    { 
     db.MovieContext.Add(movie); 
     db.SaveChanges(); 

     var postedFile = fileUpload; 
     postedFile.SaveAs(Server.MapPath("~/UploadedFiles") + pelicula.Id); 

     return RedirectToAction("Index"); 
    } 


    var content = ""; 

    foreach (ModelState modelState in ViewData.ModelState.Values) 
    { 
     foreach (ModelError error in modelState.Errors) 
     { 
      content += error.ErrorMessage + ", " + error.Exception + "<br/>"; 
     } 
    } 

    return Content(content); 

    //return View(movie); 
} 
+0

오류를 출력하는 행운? – Antevirus

+0

여전히 그 일을하고 있는데, 나는 파란 화면이있다. D : 나는 Windows LOL을 좋아한다. – Santanor

+0

괜찮아, 내가 오류있어 : (나는 스페인어에서 출력을 번역 할거야) System.InvalidOperationException : 'System.String' 형식을 변환 할 수있는 변환기가 있기 때문에 'System.Web.HttpPostedFile'형식으로 변환해야합니다. – Santanor

0

Antevirus가 답을 가지고 있지만 그것을 발견하는 데 의견을 말씀드립니다.

@using (Html.BeginForm("Create", "Members", FormMethod.Post, new { @id = "member-form", @enctype = "multipart/form-data" })) 
{ 
    <div class="form-group"> 
     <label class="control-label col-md-2">Picture</label> 
     <div class="col-md-10"> 
      <input id="fileUpload" type="file" name="fileUpload" class="file-loading"> 
      </div> 
     </div> 
} 

나는 짧은 file-input for bootstrap