Here is my straight-forward HTML 5 solution shown using an MVC Razor Form, but you could use a plain html form just as well. This solves the problem with the Input type=file not rendering the same in all browsers. You could style the browseBtn however you like by setting a background image for it. I tested this in IE 11, Firefox, and Chrome. IMO, the look of the default Chrome native control (shown in the question) is unacceptable.
Index.cshtml
<h2>Index</h2>
@using (Html.BeginForm("postFile", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <div style="display:inline-block; margin-bottom:10px">
    <input type="text" name="uploadControl" id="uploadControl" 
          style="width: 400px; height: 1.1em;" readonly="true" >
    <button type="button" id="browseBtn" >Browse...</button>
  </div>
  <input type="file" name="upfile" id="upfile" style="display:none;" >
  <button type="submit" id="uploadbtn" style="display:block">Click to upload</button>
  <br><br>
  @ViewBag.Message
}
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/UploadFile.js"></script>
UploadFile.js
$('#browseBtn').click(function () {
   $('#upfile').first().trigger("click"); //cause the browse menu to pop up
});
$('#upfile').first().change(function (event) {
   event.preventDefault();
   var fileName = $('#upfile').val();
   if (fileName && fileName.length > 0) {
      $('#uploadControl').val(fileName);
   }
});
HomeController.cs
    public ActionResult postFile(HttpPostedFileBase upfile)
    {
        if (upfile != null && upfile.ContentLength > 0)
        {
            try
            {
                string path = Path.Combine(Server.MapPath("~/Images"),
                Path.GetFileName(upfile.FileName));
                //upfile.SaveAs(path);
                ViewBag.Message =  Path.GetFileName(upfile.FileName) + " uploaded successfully";
            }
            catch (Exception ex)
            {
                ViewBag.Message = "ERROR:" + ex.Message.ToString();
            }
        }
        else
        {
            ViewBag.Message = "You have not specified a upfile.";
        }
        return View("Index");
    }