MVC EF上传图像并同时写入DB

时间:2018-02-05 16:03:44

标签: c# sql asp.net-mvc image entity-framework

我对MVC和编码很新,所以如果我不提及它,请道歉。我遇到了一个奇怪的问题,我无法解决这个问题:

我想提交一个包含图像以及其他值的表单,例如用户名,用户ID,时间戳等,并将其写入表格(SQL);现在我可以将图像作为字节输入数据库,我可以将表单提交给数据库,但由于某种原因我无法同时完成,所以它是图像/文件或表格。我遇到的错误如下:

输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符。

查看型号:

namespace errandomWeb.Models
{
    public class PhotoCompetition
    {
        public int ID { get; set; }

        public string UserID { get; set; }

        public string FirstName { get; set; }

        public string Email { get; set; }

        public byte[] CompetitionPicture { get; set; }

        //[Required]
        [Display(Name = "by checking this box I accept the Terms & Conditions")]
        public bool TermsAndConditionsAccepted { get; set; }

        public DateTime TimeStamp { get; set; }
    }
}

控制器(收到错误消息):

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult UploadCompetitionPicture(PhotoCompetition model)
        {
            string croppedImage = Request.Form["photoCompetitionCroppedPicture"];
            byte[] imageBytes = Convert.FromBase64String(croppedImage);
            var userId = User.Identity.GetUserId();
            var participation = new PhotoCompetition
            {
                CompetitionPicture = imageBytes,
                UserID = User.Identity.GetUserId(),
                FirstName = "testcase",
                Email = User.Identity.GetUserName(),
                TermsAndConditionsAccepted = true,
                TimeStamp = DateTime.UtcNow.ToUniversalTime(),
            };
            DB.PhotoCompetition.Add(participation);
            DB.SaveChanges();
            return View("Edit");
        }
    }

控制器(为图像工作,但不是表格......):

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult UploadCompetitionPicture()
        {
            string croppedImage = Request.Form["photoCompetitionCroppedPicture"];
            byte[] imageBytes = Convert.FromBase64String(croppedImage);
            var userId = User.Identity.GetUserId();
            var participation = new PhotoCompetition
            {
                CompetitionPicture = imageBytes,
                UserID = User.Identity.GetUserId(),
                FirstName = "testcase",
                Email = User.Identity.GetUserName(),
                TermsAndConditionsAccepted = true,
                TimeStamp = DateTime.UtcNow.ToUniversalTime(),
            };
            DB.PhotoCompetition.Add(participation);
            DB.SaveChanges();
            return View("Edit");
        }
    }

查看:

@model errandomWeb.Models.PhotoCompetition
@{
    ViewBag.Title = "Become Our Model";
}
<div id="photoCompetitionContainer" class="manageContainer">
    <div id="photoCompetitionHeaderSection" class="manageHeaderSection">
        <h1 id="photoCompetitionHeaderTitle" class="manageHeaderTitle">
            @ViewBag.Title
        </h1>
        <img id="photoCompetitionHeaderProfilePicture" class="manageHeaderProfilePicture" src="@Url.Action("UserPicture", "Manage")" />
        <p id="photoCompetitionHeaderPersonalizationGeneric" class="manageHeaderPersonalization">
            Hello
        </p>
        <p id="photoCompetitionHeaderPersonalizationName" class="manageHeaderPersonalization">
            @Html.TextBoxFor(m => m.FirstName, new { @id = "photoCompetitionHeaderUserName", @class = "manageHeaderUserName", @placeholder = "Stranger", @disabled = true })
        </p>
    </div>
    @Html.Partial("_ProfileLogout")
    <div id="photoCompetitionContextSection" class="manageContextSection">
        <p id="photoCompetitionContext" class="manageContext">
            Want to become our model?
        </p>
    </div>
    <div id="photoCompetitionValidationSection" class="manageValidation">
        @Html.ValidationSummary("", new { @id = "photoCompetitionValidation", @class = "manageValidation" })
    </div>
    <section id="photoCompetition" class="manageForm">
        @using (Html.BeginForm("UploadCompetitionPicture", "errandom", FormMethod.Post, new { @id = "photoCompetitionForm", @class = "form-horizontal", @role = "form", @enctype = "multipart/form-data" }))
        {
            @Html.AntiForgeryToken()
            <div id="photoCompetitionSection" class="manageSection">
                <p id="photoCompetitionSectionTitle" class="manageSectionTitle">
                    Upload your picture and be selected as our model!
                </p>
                @Html.HiddenFor(m => m.UserID)
                @Html.HiddenFor(m => m.Email)
                @Html.HiddenFor(m => m.FirstName)
                @Html.HiddenFor(m => m.TimeStamp)
                <div id="photoCompetitionProfilePictureArea" class="manageArea row">
                    @Html.LabelFor(m => m.CompetitionPicture, new { @id = "photoCompetitionProfilePictureLabel", @class = "manageLabel col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-1 col-md-3 col-lg-offset-1 col-lg-4" })
                    <a id="photoCompetitionProfilePictureSelectionButton" class="manageField col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset0 col-md-7 col-lg-offset-0 col-lg-6" href="#">
                        select a file...
                    </a>
                    @Html.TextBoxFor(m => m.CompetitionPicture, new { @id = "photoCompetitionProfilePictureField", @class = "manageField col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-0 col-md-7 col-lg-offset-0 col-lg-6", @type = "file", @style = "display: none" })
                </div>
                <div id="photoCompetitionTermsAndConditionsArea" class="manageArea row">
                    @Html.CheckBoxFor(m => m.TermsAndConditionsAccepted, new { @id = "photoCompetitionTermsAndConditionsField", @class = "photoCompetitionTermsAndConditionsField" })
                    @Html.LabelFor(m => m.TermsAndConditionsAccepted, new { @id = "photoCompetitionTermsAndConditionsLabel", @class = "photoCompetitionTermsAndConditionsLabel" })
                    @Html.ValidationMessageFor(m => m.TermsAndConditionsAccepted, "", new { @id = "photoCompetitionTermsAndConditionsValidation", @class = "manageValidation col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-4 col-md-7 col-lg-offset-5 col-lg-6" })
                </div>
                <script>
                    jQuery("#photoCompetitionProfilePictureSelectionButton").click(function () {
                        $("#photoCompetitionProfilePictureField").click();
                    });
                </script>
                <script>
                    $("#photoCompetitionProfilePictureField").change(function () {
                        var fullFileName = $("#photoCompetitionProfilePictureField").val()
                        $("#photoCompetitionProfilePictureSelectionButton").html(fullFileName.substr(fullFileName.lastIndexOf('\\') + 1));
                    });
                </script>
                <div id="photoCompetitionCroppingArea" class="manageArea row">
                    <img id="photoCompetitionOriginal" class="photoCompetitionImage" src="" alt="" style="display: none" />
                    <canvas id="photoCompetitionCropped" class="photoCompetitionImage" height="5" width="5"></canvas>
                </div>
                <div id="photoCompetitionButtonArea" class="manageArea row">
                    <input id="photoCompetitionButtonCrop" class="manageButton col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-1 col-md-10 col-lg-offset-1 col-lg-10" type="button" value="Crop" style="display: none" />
                    <input id="photoCompetitionButtonUpload" class="manageButton col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-1 col-md-10 col-lg-offset-1 col-lg-10" type="submit" value="Save" style="display: none" />
                    <input id="photoCompetitionCropX" class="photoCompetitionData" name="photoCompetitionCropX" type="hidden" />
                    <input id="photoCompetitionCropY" class="photoCompetitionData" name="photoCompetitionCropY" type="hidden" />
                    <input id="photoCompetitionCropW" class="photoCompetitionData" name="photoCompetitionCropW" type="hidden" />
                    <input id="photoCompetitionCropH" class="photoCompetitionData" name="photoCompetitionCropH" type="hidden" />
                    <input id="photoCompetitionCroppedPicture" class="photoCompetitionData" name="photoCompetitionCroppedPicture" type="hidden" />
                </div>
            </div>
        }
    </section>
    <div id="photoCompetitionReturnToMenuSection" class="manageReturnToMenuSection">
        @Html.ActionLink("Return to Menu", "Index", "", htmlAttributes: new { @id = "photoCompetitionReturnToMenuButton", @class = "manageReturnToMenuButton" })
    </div>
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="https://cdn.rawgit.com/tapmodo/Jcrop/master/js/jquery.Jcrop.min.js"></script>
    <script type="text/javascript">
        $(function () {
            if ($('#photoCompetitionCroppingArea').width() > 700) {
                $('#photoCompetitionProfilePictureField').change(function () {
                    $('#photoCompetitionOriginal').hide();
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        $('#photoCompetitionOriginal').show();
                        $('#photoCompetitionOriginal').attr("src", e.target.result);
                        $('#photoCompetitionOriginal').Jcrop({
                            onChange: SetCoordinates,
                            onSelect: SetCoordinates,
                            aspectRatio: 1,
                            boxWidth: 600,
                            addClass: 'photoCompetitionCropping'
                        });
                    }
                    reader.readAsDataURL($(this)[0].files[0]);
                });
            }
            else {
                $('#photoCompetitionProfilePictureField').change(function () {
                    $('#photoCompetitionOriginal').hide();
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        $('#photoCompetitionOriginal').show();
                        $('#photoCompetitionOriginal').attr("src", e.target.result);
                        $('#photoCompetitionOriginal').Jcrop({
                            onChange: SetCoordinates,
                            onSelect: SetCoordinates,
                            aspectRatio: 1,
                            boxWidth: 250,
                            addClass: 'photoCompetitionCropping'
                        });
                    }
                    reader.readAsDataURL($(this)[0].files[0]);
                });
            }
            $('#photoCompetitionButtonCrop').click(function () {
                var x1 = $('#photoCompetitionCropX').val();
                var y1 = $('#photoCompetitionCropY').val();
                var height = $('#photoCompetitionCropH').val();
                var width = $('#photoCompetitionCropW').val();
                var canvas = $("#photoCompetitionCropped")[0];
                var context = canvas.getContext('2d');
                var img = new Image();
                img.onload = function () {
                    canvas.height = height;
                    canvas.width = width;
                    context.drawImage(img, x1, y1, width, height, 0, 0, width, height);
                    var image = canvas.toDataURL().replace(/^data:image\/[a-z]+;base64,/, "");
                    $('#photoCompetitionCroppedPicture').val(image);
                    $('#photoCompetitionButtonUpload').show();
                    $('#photoCompetitionCropped').hide();
                    $('#photoCompetitionButtonCrop').hide();
                };
                img.src = $('#photoCompetitionOriginal').attr("src");
            });
        });
        function SetCoordinates(c) {
            $('#photoCompetitionCropX').val(c.x);
            $('#photoCompetitionCropY').val(c.y);
            $('#photoCompetitionCropW').val(c.w);
            $('#photoCompetitionCropH').val(c.h);
            $('#photoCompetitionButtonCrop').show();
        };
    </script>
}

如果有人知道我如何提交图像,同时还提交其他属性,我将非常感谢指导/建议!谢谢!

1 个答案:

答案 0 :(得分:0)

我终于完成了它。这是更新的控制器代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UploadCompetitionPicture([Bind(Exclude = "CompetitionPicture")]PhotoCompetition model)
{
    string croppedImage = Request.Form["photoCompetitionCroppedPicture"];
    byte[] imageBytes = Convert.FromBase64String(croppedImage);
    var userId = User.Identity.GetUserId();
    var participation = new PhotoCompetition
    {
        UserID = User.Identity.GetUserId(),
        FirstName = "Ken",
        Email = User.Identity.GetUserName(),
        TermsAndConditionsAccepted = true,
        TimeStamp = DateTime.UtcNow.ToUniversalTime(),
    };
    participation.CompetitionPicture = imageBytes;
    DB.PhotoCompetition.Add(participation);
    DB.SaveChanges();
    return View("Edit");
}

我想,最重要的是首先排除图片,然后提交所有其他字段,然后单独添加图片。不知道为什么,但很高兴我弄清楚了。