web-dev-qa-db-ja.com

HttpPostedFileBaseは、ASP.NET MVCで常にnullを返します

ASP.NET MVCでファイルをアップロードすると問題が発生します。私のコードは次のとおりです。

表示:

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index2</h2>
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <input type="file" />
  <input type="submit" />
}

コントローラ:

[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase uploadFile)
{
    if (uploadFile != null && uploadFile.ContentLength > 0)
    {
        string filePath = Path.Combine(Server.MapPath("/Temp"), Path.GetFileName(uploadFile.FileName));
        uploadFile.SaveAs(filePath);
    }
    return View();
}

ただし、uploadFileは常にnullを返します。誰が理由を理解できますか?

49
Joshua Son
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index2</h2>
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <input type="file" name="uploadFile"/>
  <input type="submit" />
}

aSP.net mvcでバインディング作業をモデル化するには、ploadFileに入力タイプファイルの名前を指定する必要があります。
また、入力タイプファイルの名前と引数名 of HttpPostedFileBaseが同一であることも確認してください。

118
dotnetstep

このトピックについては、オンラインで投稿されたほとんどのソリューションを試しましたが、代わりに回避策を使用する方が良いことがわかりました。

HttpPostedFileBaseおよび/またはHttpPostedFileが常にnullであるということは、実際には問題ではありませんでした。 HttpContext.Request.Filesコレクションを使用すると、手間がまったくかかりません。

例えば.

 if (HttpContext.Request.Files.AllKeys.Any())
        {
            // Get the uploaded image from the Files collection
            var httpPostedFile = HttpContext.Request.Files[0];

            if (httpPostedFile != null)
            {
                // Validate the uploaded image(optional)

                // Get the complete file path
                var fileSavePath =(HttpContext.Server.MapPath("~/UploadedFiles") + httpPostedFile.FileName.Substring(httpPostedFile.FileName.LastIndexOf(@"\")));

                // Save the uploaded file to "UploadedFiles" folder
                httpPostedFile.SaveAs(fileSavePath);
            }
        }

上記の例では、最初のファイルを取得するだけですが、コレクションをループしてすべてのファイルを保存するだけです。

HTH

ロブ

9
roblem

私のシナリオでは、問題はid属性にあり、これがありました:

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

Soultionはidを削除することでした:

<input type="file" name="file1"  />
5
pawel

この特定のユーザーへの答えではありませんが、 HTMLではformタグには値multipart/form-dataのenctype属性が必要です。 そしてもちろん属性とその両方値は正しくなければなりません。

Mvcの場合、これは、beginformを使用する場合、htmlAttributesパラメーターを指定したバージョンを使用する必要があることを意味します

2
jmoreno

別のシナリオもあります。私の場合、MVCビューでスクリプトタグを直接レンダリングしていたため、この問題が発生していました。IEが問題を示しています。

ビュー内の正しいコードは次のようになります。

@section scripts
{
    <script>
        $(document).ready(function () {
            $('.fileinput').fileinput();
...
}
0