MVC 4 Razorファイルのアップロード


249

私はMVC 4を初めて使用し、自分のWebサイトにファイルアップロードコントロールを実装しようとしています。間違いを見つけることができません。ファイルにnull値が表示されます。

コントローラ:

public class UploadController : BaseController
    {
        public ActionResult UploadDocument()
        {
            return View();
        }

       [HttpPost]
       public ActionResult Upload(HttpPostedFileBase file)
       {
           if (file != null && file.ContentLength > 0)
           {
               var fileName = Path.GetFileName(file.FileName);
               var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
               file.SaveAs(path);
           }

           return RedirectToAction("UploadDocument");
        }
    }

見る:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
    <input type="file" name="FileUpload" />
    <input type="submit" name="Submit" id="Submit" value="Upload" />
}


1
変更する必要があるのは、パブリックActionResult Upload(HttpPostedFileBase file)<input type = "file" name = "FileUpload" />
Muhammad Asad

ここに私の実装をチェックアウトstackoverflow.com/a/40990080/4251431
バシールAL-MOMANIに

2
enctypeフォームに記載されていなかった場合、1時間かかる
Savage

Upload()メソッドとボタンの間の接続はどこにありますか。onClickイベントがあるべきですか?私はasp.netの新機能
pnizzle

回答:


333

UploadメソッドのHttpPostedFileBaseパラメータは、同じ名前を持つ必要がありますfile input

したがって、入力を次のように変更します。

<input type="file" name="file" />

また、ファイルはRequest.Files次の場所にあります。

[HttpPost]
public ActionResult Upload()
{
     if (Request.Files.Count > 0)
     {
         var file = Request.Files[0];

         if (file != null && file.ContentLength > 0)
         {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(Server.MapPath("~/Images/"), fileName);
            file.SaveAs(path);
         }
     }

     return RedirectToAction("UploadDocument");
 }

2
コレクションにIndex out of boundsファイルがない場合は、例外を通過しませんRequest.Files
shashwat 14年

2
実際にはスローArgumentOutOfRangeExceptionされますが、あなたの言う通りです、私は更新しました
クリスティプフ2014年

2
Html.BeginFormのパラメーターは、アクション名とコントローラー名( 'コントローラー'の接頭辞なし。例:HomeControllerの代わりにHome)であることを忘れないでください。もう1つの重要なことは、タグを開くBeginFormであるため、<form>タグを内部に含めないことです
pocjoc

5
つまり、ビューモデルのプロパティ名は、入力タイプの名前と一致する必要があります。あなたの場合はviewmodelプロパティの名前はAgentPhoto、あなたはあなたのビューに以下を持っている必要があります<input type="file" name="AgentPhoto"/>
ダヤン

var path = Path.Combine(Server.MapPath("~/Images/"), fileName);、クラス「サーバー」が見つかりません、どのパッケージを使用しますか?
DaniloPádua15年

65

それを明確にします。モデル:

public class ContactUsModel
{
    public string FirstName { get; set; }             
    public string LastName { get; set; }              
    public string Email { get; set; }                 
    public string Phone { get; set; }                 
    public HttpPostedFileBase attachment { get; set; }

ポストアクション

public virtual ActionResult ContactUs(ContactUsModel Model)
{
 if (Model.attachment.HasFile())
 {
   //save the file

   //Send it as an attachment 
    Attachment messageAttachment = new Attachment(Model.attachment.InputStream,       Model.attachment.FileName);
  }
}

最後に、hasFileをチェックする拡張メソッド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AtlanticCMS.Web.Common
{
     public static class ExtensionMethods 
     {
         public static bool HasFile(this HttpPostedFileBase file)
         {
             return file != null && file.ContentLength > 0;
         }        
     }
 }

public HttpPostedFileBase添付ファイル{get; セットする; } /添付ファイルは識別されません
Codeone 2015年

Colaは、定義されていないAttachmentタイプを参照していると思います。
Karson、2015

2
ビューは、user2028367で説明されているように使用できます。実際、Html.BeginFormパーツに新しい{enctype = "multipart / form-data"}を含めるのを忘れたため、アクションでファイルを表示できませんでした。すばらしい答えです。モデルクラスと拡張メソッドで表示するための+1。
アルジュン

@BishoyHannaフォームに添付ファイルを配置する方法。他の値については、かみそりは単純な構文を提供しますが、このファイルに対してどのようにそれを行うのですか?
Denis V

1
こんにちは、@ ClintEastwood、その投稿は1つのファイルをアップロードするためのものでした。私は複数のアップロードに一致するものを(オンラインで)検索し、うまくいくと思いました。「Request.Files」を使用していませんここでも、そのモデルに基づく stackoverflow.com/questions/36210413/...
Bishoyハンナ

17

ページを表示

@using (Html.BeginForm("ActionmethodName", "ControllerName", FormMethod.Post, new { id = "formid" }))
 { 
   <input type="file" name="file" />
   <input type="submit" value="Upload" class="save" id="btnid" />
 }

スクリプトファイル

$(document).on("click", "#btnid", function (event) {
        event.preventDefault();
        var fileOptions = {
            success: res,
            dataType: "json"
        }
        $("#formid").ajaxSubmit(fileOptions);
    });

コントローラ内

    [HttpPost]
    public ActionResult UploadFile(HttpPostedFileBase file)
    {

    }

2
@Muflixに同意しAJAXます。ここでは必要ありません。Html.BeginFormすでに仕事をしています。あなたがへのリダイレクトをしたくない場合はAJAXにのみ必要とされている<form action=LINK>
JAC

1
Ajaxはユーザーエクスペリエンスを向上させることができるので、大きなファイルに適しています。
markthewizard1234 2017

6

入力フィールドの名前を変更する必要があるのは、パラメーターと入力フィールド名に同じ名前が必要なため、この行を置き換えるだけです。コードは正常に機能しています

 <input type="file" name="file" />

2

より良い方法は、コントローラーまたはAPIでHttpPostedFileBaseを使用することだと思います。この後、サイズ、タイプなどを簡単に検出できます。

ここにあるファイルのプロパティ:

MVC3 HttpPostedFileBaseが画像かどうかを確認する方法

たとえばImageApi:

[HttpPost]
[Route("api/image")]  
public ActionResult Index(HttpPostedFileBase file)  
{  
    if (file != null && file.ContentLength > 0)  
        try 
        {  
            string path = Path.Combine(Server.MapPath("~/Images"),  
               Path.GetFileName(file.FileName));

            file.SaveAs(path);  
            ViewBag.Message = "Your message for success";  
        }  
        catch (Exception ex)  
        {  
            ViewBag.Message = "ERROR:" + ex.Message.ToString();  
        }  
    else 
    {  
        ViewBag.Message = "Please select file";  
    }  
    return View();  
}

お役に立てば幸いです。


何より良い?OPはすでにを使用していHttpPostedFileBaseます。
jpaugh 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.