Search code examples
c#asp.net-mvcphoto-upload

"Server Error in '/' Application" When uploading an image


I want to upload a profile picture to my system.But I click upload, "Server Error in '/' Application" message appears. Also I have figured out the URL is little bit different than Correct URL should be like this.
/ProfileController/UploadPhoto
But the URL in the here is /admin/ProfileController/UploadPhoto
What should do in order to make this work?
This is my code in controller

[HttpPost]
public ActionResult UploadPhoto(HttpPostedFileBase file)
{
     if (file != null && file.ContentLength > 0)
     {
            var user = Session["userID"].ToString();
            var fileExt = Path.GetExtension(file.FileName);
            var fileName = user + ".png";

            if (fileExt.ToLower().EndsWith(".png") || fileExt.ToLower().EndsWith(".jpg"))
            {
                 var filePath = HostingEnvironment.MapPath("~/Content/images/profile/") + fileName;
                var directory = new DirectoryInfo(HostingEnvironment.MapPath("~/Content/images/profile/"));

                if (directory.Exists == false)
                {
                     directory.Create();
                }
                ViewBag.FilePath = filePath.ToString();
                file.SaveAs(filePath);
                return RedirectToAction("Index", new { Message = ManageMessageId.PhotoUploadSuccess });

            }
            else
            {
                  return RedirectToAction("Index", new { Message = ManageMessageId.FileExtensionError });

            }
     }
     return RedirectToAction("Index", new { Message = ManageMessageId.Error }); 
}             

This is the code in view

<dl class="dl-horizontal">
        <dd>
            @if (User != null)
            {
                 var imgUrl = Url.Content("Content/Images/" + User + ".png") + "?time=" + DateTime.Now.ToString();
                <div class="input-field col s12">
                    <div class="input-field col s12">
                        <img src="@imgUrl" height="250" width="250" />
                    </div>
                    <div class="mngimg">
                        @using (Html.BeginForm("UploadPhoto", "ProfileController", FormMethod.Post, new { enctype = "multipart/form-data" }))
                        {
                            <div class="input-field col s12">
                                <input type="file" name="file" id="files" onchange="this.form.submit()" />
                            </div>
                        }
                    </div>
                </div>
            }
        </dd>
    </dl>

Image of the error I get

RouteConfig.cs

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "AdminPanel",
            "admin/{controller}/{action}/{id}",
            new {`controller="Home", action = "Index", id = UrlParameter.Optional },
            new[] { "OnlineElection.Controllers.Admin" } );

routes.MapRoute(
            name:"Default",
            url:"{controller}/{action}/{id}",
            defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces:new[] { "OnlineElection.Controllers" }
        );

Solution

  • The form URL you're posting to is invalid.

    When using Controllers, you omit the Controller word and use only the name of the controller, in this case ProfileController becomes just Profile, this also counts for URL's.

    Your Html.BeginForm should in fact be @using (Html.BeginForm("UploadPhoto", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" }))