Upload plików do katalogu i bazy

0

Witajcie.

Mam takie pytanko.

Jak zrobić aby wczytany w widoku plik ( obrazek ) został dodany do mojego katalogu aplikacji Content/Images/Products a ścieżka do niego zapisana w bazie?

Mam ViewModel nowego produktu, który przekazuje sobie do akcji kontrolera. Oczywiście ta akcja odpowiedzialna jest za dodawanie nowego produktu.

Ten ViewModel posiada pole string ProductImageUrl.

Jak przenieść ten plik do wybranego katalogu i zapisać ścieżkę do bazy?

0

To w koncu dodajac produkt przesylasz do kontrolera URL do pliku czy przesylasz bezposrednio plik (korzystajac z input'a file) ?

0

Właśnie jeszcze ni jak bo ale kombinuje co zrobić :P

Mam tak w widoku inputa do uploadowania plików:

 
 <div class="form-group">
            @Html.LabelFor(model => model.ProductImageUrl, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.ProductImageUrl, new { type = "file", enctype = "multipart/form-data" })
                @Html.ValidationMessageFor(model => model.ProductImageUrl, "", new { @class = "text-danger" })
            </div>
        </div>

Wczytuje sobie obrazek, niby ok. Ale jak potem go przekazać do root directory np do ~/Content/Images/Products a w bazie przechować ścieżkę do tego obrazka dla nowego produktu?

W akcji kombinuje coś takiego:

 
 [HttpPost]
        public ActionResult AddNewProduct(NewProductViewModel newProd, HttpPostedFileBase file)
        {

            using (var db = new ApplicationDbContext())
            {
                var product = new Product
                {
                    ProductName = newProd.ProductName,
                    ProductImageUrl = newProd.ProductImageUrl,
                    Category = _categoryService.GetAllCategories().ToList(),
                    ProductDescription = newProd.ProductDescription,
                    PricePerUnit = newProd.ProductPrice,
                    ProductQuantity = newProd.ProductQuantity,
                    PremiumPoints = newProd.PremiumPoints,
                    NutritionalValues = new NutritionalValue
                    {
                        Calorific = newProd.ProductCalorific,
                        Carbohydrate = newProd.ProductCarbohydrates,
                        Protein = newProd.ProductProteins,
                        Fat = newProd.ProductFat
                    },
                    Suplier = new Suplier
                    {
                        CompanyName = newProd.ProductSuplierName,
                        Address = new Collection<Addresses>
                               {
                                   new Addresses()
                                   {
                                       Country = newProd.ProductSuplierCountry,
                                       City = newProd.ProductSuplierCity,
                                       StreetName = newProd.ProductSuplierStreetName,
                                       PostalCode = newProd.ProductSuplierPostalCode,
                                       FlatNumber = newProd.ProductSuplierFlatNumber
                                   }
                               }
                    }
                };

                if (file != null)
                {
                    var fileName = Path.GetFileName(file.FileName);
                    if (fileName != null)
                    {
                        try
                        {
                            var path = Path.Combine(Server.MapPath("~/Content/Images/Products/"), fileName);
                            file.SaveAs(path);

                            _productService.InsertProduct(product);
                            return RedirectToAction("Index", "Home");
                        }
                        catch (Exception ex)
                        {
                            ViewBag.Message = "Bład!" + ex.Message;
                        }
                    }
                    else
                    {
                        ViewBag.Message = "Nie udało się załadować pliku!";
                    }
                }
                else
                {
                    ViewBag.Message = "Wybierz odpowiedni plik";
                }

                

            }
            return View();
        }

Czyli w akcji przekazuje sobie jako drugi parametr ten plik, tylko coś mi to nie działa :P

1

Ale co to znaczy konkretnie, ze "cos ci nie dziala".
Pierwsze co rzuca mi sie w oczy:
enctype ma byc atrybutem taga form, a nie input.
Domyslny model binder w ASP.NET MVC binduje przesylany plik po atrybucie name.
W zwiazku z tym, jezeli argumentem akcji jest "HttpPostedFileBase file", to powinienes miec nastepujacy input w widoku:

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

Racja. Zawsze zapominam, że przesyłane parametry z widoku do akcji musza nazywać sie tak samo jak w akcji :D

Ale mój widok nie przyjmuje tylko obrazków, przyjmuje również wartości tekstowe to może być na całym @html.BeginForm() enctype ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1