Как сохранить размещенное изображение в asp.net? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь по-другому сохранить изображение типа String в моей базе данных, но оно всегда дает мне System.Web.HttpPostedFileWrapper. Я не понимаю, что здесь не так

Я хочу создать новый продукт, содержащий заголовок, описание, изображение и их категорию. Когда я публикую данные через создание, они сохраняют данные, но не отображают изображение , и когда я проверяю поле изображения базы данных, я нахожу значение изображения HttpPostedFileWrapper не p.png или product.jpg -

Это контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
[Route("Create")]
public ActionResult Create([Bind(Include = "Ida,description,image,Userid,Idc,titre")] Article article,HttpPostedFileBase postedFile)
{
    if (ModelState.IsValid)
    {
        if (postedFile != null)
        {
            var a =new byte[postedFile.ContentLength] ;
            article.image = Convert.ToBase64String(a);
            postedFile.InputStream.Read(a, 0, postedFile.ContentLength);
        }

        db = new IdentityDBEntities2();
        // Add article to database  
        article.UserId = System.Web.HttpContext.Current.User.Identity.GetUserId();
        article.Idc = Convert.ToInt32(Request["Idc"]);

        db.Articles.Add(article);
        ViewBag.Idcc = new SelectList(db.Categories, "Id", "libelle");
        db.SaveChanges();                
        return RedirectToAction("Index");
    }

    return View(article);
}

Ответы [ 4 ]

1 голос
/ 07 марта 2019

Пожалуйста, измените это, переместите строку чтения кода из потока вверх

 if (postedFile != null)
                {
                    var a = new byte[postedFile.ContentLength];
                    postedFile.InputStream.Read(a, 0, postedFile.ContentLength);
                    article.image = Convert.ToBase64String(a);

                }

Обновлен:

Я пытался воспроизвести исходный код на моей стороне, он работал хорошо.

Вы установили new {enctype="multipart/form-data"} для своей формы?

[HttpPost]
        //[ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Ida,description,image,Userid,Idc,titre")] Article article, HttpPostedFileBase postedFile)
        {
            if (ModelState.IsValid)
            {
                if (postedFile != null)
                {
                    var a = new byte[postedFile.ContentLength];
                    postedFile.InputStream.Read(a, 0, postedFile.ContentLength);
                    article.image = Convert.ToBase64String(a);

                    //db = new IdentityDBEntities2();
                    //// Add article to database  
                    //article.UserId = System.Web.HttpContext.Current.User.Identity.GetUserId();
                    //article.Idc = Convert.ToInt32(Request["Idc"]);

                    //db.Articles.Add(article);
                    //ViewBag.Idcc = new SelectList(db.Categories, "Id", "libelle");
                    //db.SaveChanges();
                    TempData["Image"] = article.image;
                }
                return RedirectToAction("Index");
            }
            return View(article);
        }

Create.cshtml file

@using(Html.BeginForm("Create","Feedback",FormMethod.Post,new {enctype="multipart/form-data"}))
{

    <input type="file" name="postedFile"/>

    <input type="submit" value="Save"/>
}

Файл Index.cshtml

@{
    var imgSrc = string.Format("data:image/gif;base64,{0}", TempData["Image"]);
}
<img src="@imgSrc"/>
0 голосов
/ 07 марта 2019

Просто обновление. Я использовал varbinary в конце концов. Я добавил изображение в базу данных, используя

if (fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".png")
        {
            Stream stream = postedFile.InputStream;
            BinaryReader reader = new BinaryReader(stream);
            byte[] imgByte = reader.ReadBytes((int)stream.Length);
            con = new SqlConnection("MyConnectionString");
            SqlCommand cmd = new SqlCommand("insert into Events (AspNetUsersId,EvtName,EvtType,EvtDescription,EvtDate,EvtVote, EvtImage) values (@AspNetUsersId, @EvtName, @EvtType, @EvtDescription, @EvtDate, @EvtVote, @EvtImage)", con);

            cmd.Parameters.AddWithValue("@AspNetUsersId", userId);
            cmd.Parameters.AddWithValue("@EvtName", eventName.Text);
            cmd.Parameters.AddWithValue("@EvtType", eventType.Text);
            cmd.Parameters.AddWithValue("@EvtDescription", eventDescription.Text);
            cmd.Parameters.AddWithValue("@EvtDate", datetimepicker.Value);
            cmd.Parameters.AddWithValue("@EvtVote", 0);
            cmd.Parameters.Add("@EvtImage", SqlDbType.VarBinary).Value = imgByte;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }

И отобразил его в теге изображения с помощью

byte[] imgByte = null;
        con = new SqlConnection("MyConnectionString");
        SqlCommand cmd = new SqlCommand("SELECT * FROM Events", con);
        con.Open();
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            imgByte = (byte[])(dr["EvtImage"]);
            string str = Convert.ToBase64String(imgByte);
            imageTest.Src = "data:Image/png;base64," + str;
        }

Код переднего конца:

<img runat="server" id="imageTest" src="imageIDtagName" />

Спасибо всем за помощь!

0 голосов
/ 07 марта 2019

Ваш postsfile является параметром HttpPostedFileBase -типа. Вы должны сохранить полное имя файла на клиенте, а не сохранять этот параметр напрямую. Попробуйте это:

article.image = postedFile.FileName;
0 голосов
/ 07 марта 2019

Вы хотите просто скопировать файл?Почему бы не использовать:

System.IO.File.Copy("source", "destination");

http://msdn.microsoft.com/en-us/library/c6cfw35a.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...