// зберігаємо закачані картинки з тимчасової папки в постійну базу данних private string SaveImages(Article newArticle, int tempId) { string userId = User.Identity.GetUserId(); List<string> imgTags = new List<string>(); int nextNpp = GetNextImgNpp(newArticle.Id, "ArticleImages"); foreach (Match imgTag in Regex.Matches(newArticle.Articletext, imgTagPattern.ToString(), RegexOptions.IgnoreCase)) { int imgTagNpp = Convert.ToInt32(imgTag.Groups[1].Value); DraftArticleImage tempimg = db.DraftArticleImages.Where(i => i.Article_Id == tempId).Where(i => i.Npp == imgTagNpp).Where(i => i.Userid == userId).First(); if (tempimg == null) { continue; } byte[] imageData = null; try { using (FileStream fs = new FileStream(Server.MapPath("~" + tempimg.Imgdir + tempimg.Imgname), FileMode.Open)) { imageData = new byte[fs.Length]; fs.Read(imageData, 0, imageData.Length); } } catch (Exception ex) { return "Error when reading images in FileStream " + ex.Message; } ArticleImage img = new ArticleImage { Article = newArticle, Imgtitle = imgTag.Groups[2].Value, Imgname = tempimg.Imgname, Imgfile = imageData, Npp = nextNpp++, Imgdate = DateTime.Now, Userid = newArticle.Userid }; ArticleImage addImgResul = new ArticleImage(); try { addImgResul = db.ArticleImages.Add(img); db.SaveChanges(); } catch (Exception ex) { return "Error when adding image to ArticleImages " + ex.Message; } try { if (addImgResul != null) { db.DraftArticleImages.Remove(tempimg); db.SaveChanges(); try { string tempImgToDelete = Request.MapPath("~" + tempimg.Imgdir + tempimg.Imgname); if (System.IO.File.Exists(tempImgToDelete)) { System.IO.File.Delete(tempImgToDelete); } } catch (Exception ex) { return "Error when deleting image file from temp dir " + ex.Message; } } } catch (Exception ex) { return "Error when Removing image from Tempimages " + ex.Message; } } return "true"; }
private List<string> GetErrImgTags(Article newArticle) { if (newArticle.Articletext != null) { List<string> errTags = new List<string>(); foreach (var item in imgTagPattern.Matches(newArticle.Articletext)) { int countImgTagErr = imgOpenTagPattern.Matches(item.ToString()).Count; if (countImgTagErr > 1) { errTags.Add(@"""" + item.ToString() + @""""); } } StringBuilder artTxtWithoutImgTags = new StringBuilder(imgTagPattern.Replace(newArticle.Articletext, String.Empty)); foreach (var item in imgOpenTagPattern.Matches(artTxtWithoutImgTags.ToString())) { errTags.Add(@"""" + item.ToString() + @""""); } foreach (var item in imgCloseTagPattern.Matches(artTxtWithoutImgTags.ToString())) { errTags.Add(@"""" + item.ToString() + @""""); } string userId = HttpContext.User.Identity.GetUserId(); List<int> allImgsNpp = new List<int>(); foreach (var tempimage in db.DraftArticleImages.Where(i => i.Article_Id == newArticle.Id).Where(i => i.Userid == userId).ToList()) { allImgsNpp.Add(tempimage.Npp); } foreach (var articleImage in db.ArticleImages.Where(i => i.Article.Id == newArticle.Id).Where(i => i.Userid == userId).ToList()) { allImgsNpp.Add(articleImage.Npp); } foreach (Match imgTag in Regex.Matches(newArticle.Articletext, imgTagPattern.ToString(), RegexOptions.IgnoreCase)) { int imgTagNpp = Convert.ToInt32(imgTag.Groups[1].Value); if (!allImgsNpp.Contains(imgTagNpp)) { errTags.Add(@"""" + imgTag.ToString() + @""" (изображения с таким номером нет)"); } } return errTags.Count == 0 ? null : errTags; } return null; }
private bool CreateEdit(Article article, int[] selectedProglangs, bool isNew = true) { bool error = false; List<string> errImgTags = GetErrImgTags(article); if (ModelState.IsValid && selectedProglangs != null && article.Asubject1 != 0 && errImgTags == null) { Article newArticle; int tempId = article.Id; if (isNew) { newArticle = new Article(); } else { newArticle = db.Articles.Find(article.Id); newArticle.Proglangs.Clear(); } newArticle.Title = article.Title; newArticle.Articletext = article.Articletext; newArticle.Asubject1 = article.Asubject1; newArticle.Userid = article.Userid; foreach (var lang in db.Proglangs.Where(l => selectedProglangs.Contains(l.Id))) { newArticle.Proglangs.Add(lang); } if (isNew) { newArticle = db.Articles.Add(newArticle); ArticleRate articlerate = new ArticleRate() { Article = newArticle, Plus = 0, Minus = 0 }; db.ArticleRates.Add(articlerate); } else { db.Entry(newArticle).State = EntityState.Modified; } db.SaveChanges(); string imgResult = SaveImages(newArticle, tempId); if (imgResult.CompareTo("true") != 0) { ModelState.AddModelError("Images", "Произошел сбой при сохранении изображений. Попробуйте еще раз. " + imgResult); error = true; } removeArticleCookies(tempId); if (!error) { return true; //return RedirectToAction("Index"); } } else { error = true; if (selectedProglangs == null) { ModelState.AddModelError("Proglangs", "Укажите языки программирования"); } else { foreach (var lang in db.Proglangs.Where(l => selectedProglangs.Contains(l.Id))) { article.Proglangs.Add(lang); } } if (article.Asubject1 == 0) { ModelState.AddModelError("Asubject1", "Укажите тему статьи"); } if (errImgTags != null) { ModelState.AddModelError("Articletext", "В статье находятся ошибочно вставленные теги изображения: " + String.Join(", ", errImgTags)); } } if (error) { ArticleAdditionData articleAdditionData = new ArticleAdditionData(); //GetCurrentArticleData(article, articleAdditionData); ViewBag.Asubject1 = articleAdditionData.Asubjects; ViewBag.articleAdditionData = articleAdditionData; //article.Articletext = EncodeString(article.Articletext); //article.Asubject1 = int.Parse(articleAdditionData.Asubjects.Where(i => i.Selected == true).First().Value); //article_Asubject1 } return false; }
private void GetCurrentArticleData(Article article, ArticleAdditionData articleAdditionData) { HttpCookie titleCookie = HttpContext.Request.Cookies.Get("Title" + article.Id); HttpCookie articletextCookie = HttpContext.Request.Cookies.Get("Articletext" + article.Id); HttpCookie asubject1Cookie = HttpContext.Request.Cookies.Get("Asubject1" + article.Id); HttpCookie proglangsCookie = HttpContext.Request.Cookies.Get("selectedProglangs" + article.Id); if (titleCookie != null) article.Title = titleCookie.Value.Replace("(<)", "<").Replace("(>)", ">"); if (articletextCookie != null) article.Articletext = articletextCookie.Value.Replace("(<)", "<").Replace("(>)", ">"); if (asubject1Cookie != null) { int subjectId; if (int.TryParse(asubject1Cookie.Value, out subjectId)) { article.Asubject1 = subjectId; } else { article.Asubject1 = article.Asubject1; } articleAdditionData.Asubjects = CreateSelectList("Выберите тему", "0", article.Asubject1.ToString()); } else { articleAdditionData.Asubjects = CreateSelectList("Выберите тему", "0", article.Asubject1.ToString()); } if (proglangsCookie != null && !String.IsNullOrWhiteSpace(proglangsCookie.Value)) { List<string> proglangs_ = proglangsCookie.Value.Split(',').ToList(); List<int> proglangs = proglangs_.Select(s => int.Parse(s)).ToList(); article.Proglangs = db.Proglangs.Where(e => proglangs.Contains(e.Id)).ToList(); } articleAdditionData.Proglangs = db.Proglangs.ToList(); string userId = User.Identity.GetUserId(); articleAdditionData.DraftArticleImags = db.DraftArticleImages.Where(e => e.Userid == userId) .Where(e => e.Article_Id == article.Id).ToList(); }
private Article CreateEdit(int? id, bool isNew) { Article article; if (isNew) { article = new Article() { Id = (int)id }; } else { DraftArticle draftArticleIsExists = db.DraftArticles.Where(i => i.Article_Id == id).FirstOrDefault(); if (draftArticleIsExists == null) { DraftArticle draftArticle = new DraftArticle() { Article_Id = (int)id }; draftArticle = db.DraftArticles.Add(draftArticle); db.SaveChanges(); ViewBag.IsDraftExists = false; } else { ViewBag.IsDraftExists = true; } article = db.Articles.Find(id); if (article != null) { StringBuilder sb = new StringBuilder(HttpUtility.HtmlDecode(article.Articletext)); article.Articletext = sb.ToString(); } } ArticleAdditionData articleAdditionData = new ArticleAdditionData(); GetCurrentArticleData(article, articleAdditionData); ViewBag.Asubject1 = articleAdditionData.Asubjects; ViewBag.articleAdditionData = articleAdditionData; return article; }