5

ファイルをサーバーにアップロードするためのcshtmlファイルがあります。

@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary();
    <div class="alert alert-success alert-dismissible" role="alert">@ViewBag.Message</div>

        <div class="form-horizontal">
        <h4>Upload Data Documents</h4>
        <hr />
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.project_id)

        <div class="form-group">
            <label class="control-label col-md-2">Some Other File</label>
            <div class="col-md-10">
                <input type="file" name="someOtherFile" class="form-control" />
                <span class="field-validation-error" id="spanfilesomeOtherFile"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-md-2">Results Comparison</label>
            <div class="col-md-10">
                <div class="form-group">
                    <div class="col-md-4">
                        <input type="file" name="FileUploadResultsComparison" class="form-control" placeholder=".col-md-4"/>
                        <span class="field-validation-error" id="spanfileResultsComparison"></span>
                    </div>
                    <div class="col-md-4">
                        @if (ViewData["Project"] != null)
                        { 
                            @Html.DropDownList("resultsComp_project", (SelectList)ViewData["Project"], "Select a Project", new { @class = "form-control", @placeholder = ".col-md-4" })
                        }
                    </div>
                </div>
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-md-2">Memory Usage</label>
            <div class="col-md-10">
                <div class="form-group">
                    <div class="col-md-4">
                        <input type="file" name="FileUploadMemoryUsage" class="form-control" />
                        <span class="field-validation-error" id="spanfileMemoryUsage"></span>
                    </div>
                    <div class="col-md-4">
                        @if (ViewData["Project"] != null)
                        {
                            @Html.DropDownList("memUsage_project", (SelectList)ViewData["Project"], "Select a Project", new { @class = "form-control", @placeholder = ".col-md-4" })
                        }
                    </div>
                </div>
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" name="Submit" id="btnSubmit" value="Upload Files" class="btn btn-default" />
            </div>
        </div>
}

そして、私のコントローラーは次のとおりです

[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file)
{
    foreach (string upload in Request.Files)
    {
        if (!(Request.Files[upload] != null && Request.Files[upload].ContentLength > 0)) continue;

        HttpPostedFileBase file = Request.Files[upload];

        if (ModelState.IsValid)
        {
            if (file == null)
            {
                ModelState.AddModelError("File", "Please Upload Your file");
            }
            else if (file.ContentLength > 0)
            {
                int MaxContentLength = 1024 * 1024 * 3; //3 MB
                string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".pdf" };

                if (!AllowedFileExtensions.Contains(file.FileName.Substring(file.FileName.LastIndexOf('.'))))
                {
                    ModelState.AddModelError("File", "Please file of type: " + string.Join(", ", AllowedFileExtensions));
                }

                else if (file.ContentLength > MaxContentLength)
                {
                    ModelState.AddModelError("File", "Your file is too large, maximum allowed size is: " + MaxContentLength + " MB");
                }
                else
                {
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/Content/Upload"), fileName);
                    file.SaveAs(path);
                    ModelState.Clear();
                    ViewBag.Message = "File uploaded successfully";
                }
            }
        }
    }
    return View();
}

上記のコードは、ファイルの検証を含めて機能します。ただし、ファイルに関連付けられている「プロジェクト」に関して2つの問題があります。

  1. 各ファイルに関連付けられた Project(id) をコントローラーに送信/返すにはどうすればよいですか?
  2. ファイルに対して「プロジェクト」ドロップダウンが選択されているかどうかを選択的に検証するにはどうすればよいですか? たとえば (ファイルを参照して選択した場合、対応する「resultsComp_project」値がドロップダウンで選択されていることを確認するにはどうすればよいですか?)

  3. ファイルとプロジェクトの両方が選択されている場合 (つまり、name="FileUploadMemoryUsage" & name="FileUploadResultsComparison") を関連付ける方法

メモリ使用量の情報は null になる可能性があることに注意してください。コードは、入力された場合にのみファイルとプロジェクトを処理します。

4

1 に答える 1

2

アップロードされているファイルに基づいて検証を処理するようにコントローラーを変更する必要がありました。

[HttpPost]
public ActionResult FileUpload(HttpPostedFileBase file)
{
    foreach (string upload in Request.Files)
    {
        if (!(Request.Files[upload] != null && Request.Files[upload].ContentLength > 0)) continue;

        int memUsage_baseline_id = 0;
        int timingComp_baseline_id = 0;
        if (upload == "FileUploadMemoryUsage" || upload == "FileUploadResultsComparison")
        {
            if (upload == "FileUploadMemoryUsage")
            {
                if (Request.Params["memUsage_project"] == null || Request.Params["memUsage_project"] == "")
                {
                    ModelState.AddModelError("Project", "Please Select Project for Memory Usage");
                }
                else
                {
                    memUsage_baseline_id = int.Parse(Request.Params["memUsage_project"]);
                }
            }
            else
            {
                if (Request.Params["resultsComp_project"] == null || Request.Params["resultsComp_project"] == "")
                {
                    ModelState.AddModelError("Project", "Please Select Project for Timing Comparison");
                }
                else
                {
                    timingComp_baseline_id = int.Parse(Request.Params["resultsComp_project"]);
                }
            }
        }

        HttpPostedFileBase file = Request.Files[upload];

        if (ModelState.IsValid)
        {
            if (file == null)
            {
                ModelState.AddModelError("File", "Please Upload Your file");
            }
            else if (file.ContentLength > 0)
            {
                int MaxContentLength = 1024 * 1024 * 3; //3 MB
                string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".pdf" };

                if (!AllowedFileExtensions.Contains(file.FileName.Substring(file.FileName.LastIndexOf('.'))))
                {
                    ModelState.AddModelError("File", "Please file of type: " + string.Join(", ", AllowedFileExtensions));
                }

                else if (file.ContentLength > MaxContentLength)
                {
                    ModelState.AddModelError("File", "Your file is too large, maximum allowed size is: " + MaxContentLength + " MB");
                }
                else
                {
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/Content/Upload"), fileName);
                    file.SaveAs(path);
                    ModelState.Clear();
                    ViewBag.Message = "File uploaded successfully";
                }
            }
        }
    }
    return View();
}   
于 2014-11-24T15:22:02.450 に答える