示例#1
0
        public ActionResult Save(HttpPostedFileBase cv)
        {
            var response = new JsonResponse();
            var userInfo = new UserInfo();

            try
            {
                var form = Request.Form;

                userInfo.Email = Server.HtmlEncode(form["email"]);
                var builder = new StringBuilder(userInfo.Email);
                builder.Append(" - CV");

                // проверяем файл резюме и, если валидный, сохраняем на диск
                if (cv != null && cv.ContentLength > 0)
                {
                    if (cv.ContentLength > 250000)
                    {
                        response.AddError("cv",
                                          "Файл резюме превышает 250Кб. Попробуйте его укоротить и отправить еще раз.");
                    }
                    else
                    {
                        builder.Append(Path.GetExtension(cv.FileName));
                        var path = Path.Combine(Server.MapPath("~/App_Data"), builder.ToString());
                        cv.SaveAs(path);
                    }
                }

                // просматриваем все ответы и сохраняем их
                foreach (var key in form.AllKeys.Where(k => k.StartsWith("q")))
                {
                    var question = new QuestionInfo {
                        Question = key, Answer = Server.HtmlEncode(form[key])
                    };
                    if (form.AllKeys.Contains(key + "_o"))
                    {
                        question.Option = Server.HtmlEncode(form[key + "_o"]);
                    }
                    userInfo.Questions.Add(question);
                }

                // сохраняем личную информацию
                userInfo.CV         = builder.ToString();
                userInfo.MK         = Server.HtmlEncode(form["mk"]);
                userInfo.Name       = Server.HtmlEncode(form["name"]);
                userInfo.Phone      = Server.HtmlEncode(form["phone"]);
                userInfo.Additional = Server.HtmlEncode(form["additional"]);

                var recommend = string.Concat(form["recommend"],
                                              form.AllKeys.Contains("recommend_o") ? "→" + form["recommend_o"] : "");

                userInfo.Recommend = Server.HtmlEncode(recommend);

                var serializer = new DataContractSerializer(typeof(UserInfo));

                // строим безопасное имя файла анкеты в смысле файловой системы
                // при построении имен файлов предполагается, что email уникален
                builder = new StringBuilder(userInfo.Email);
                builder = Path.GetInvalidFileNameChars().Aggregate(builder, (current, c) => current.Replace(c, '_'));
                builder.Append(".xml");

                // сериализуем объект в xml и сохраняем
                using (var fs = System.IO.File.Open(Server.MapPath(builder.Insert(0, "~/App_Data/").ToString()), FileMode.Create))
                {
                    using (var xmlWriter = XmlWriter.Create(fs, new XmlWriterSettings()
                    {
                        Indent = true
                    }))
                    {
                        serializer.WriteObject(xmlWriter, userInfo);
                    }
                }
            }
            catch (Exception e)
            {
                response.AddError("hidden", "Неожиданная ошибка на сервере. Скорее всего недодасточно прав на создание файла анкеты.");
            }

            return(new NewtonsoftJsonResult(response));
        }