Я пытаюсь заполнить базу данных изображением, именем изображения, номером изображения и ценой изображения, но заполнен только столбец изображения - PullRequest
0 голосов
/ 28 мая 2019

Я использую angular в качестве внешнего интерфейса и .NET Web API в качестве внутреннего и SQL Server 2012. Я пытаюсь заполнить свою базу данных изображением, именем изображения, номером и ценой, но заполняется только изображение.

Угловой

image.component.ts

imageUrl:String="";
 fileToUpload:File=null;

 handleImageChange(file: FileList){
   this.fileToUpload = file.item(0);
   var reader = new FileReader();
   reader.onload=(event:any)=>{
     this.imageUrl=event.target.result;
   }
   reader.readAsDataURL(this.fileToUpload);
 }
uploadImage(imageData){
    console.log(0)
    let name=imageData.name;
    let number=imageData.number;
    let price=imageData.price;
    this.service.uploadImage(this.fileToUpload, name, number, price).subscribe(
      data=>{
        alert("successfully uploaded");
        this.productForm.reset();
        this.imageUrl="";
      }
    );
  }

image.service.ts

 baseUrl:string="http://localhost:62215/api/product/";

  uploadImage(fileToUpload:File, imagename:string, num:string, price:string){


    let formData:FormData = new FormData();
    formData.append("file",fileToUpload,fileToUpload.name);
    formData.append("Imagename",name);
    formData.append("Number",num);
    formData.append("Price",price);

    return this.http.post(this.baseUrl+"UploadImage",formData,this.httpOptions);  
  }

.NET Web API

ProductController.cs

[HttpPost]
[Route("UploadImage")]
public IHttpActionResult UploadImage()
{
    HttpRequest Request = HttpContext.Current.Request;

    try
    {
        if (Request.Files.Count > 0)
        {
            using (FreeShareEntities obj = new FreeShareEntities())
            {
                foreach (string file in Request.Files)
                {
                    var postedFile = Request.Files[file];
                    var filePath = HttpContext.Current.Server.MapPath("~/Images/" + postedFile.FileName);
                    postedFile.SaveAs(filePath);

                    ImageDemo image = new ImageDemo();
                    image.Name = Request["name"];
                    image.Image = postedFile.FileName;
                    image.Number = Request["num"];
                    image.Price = Request["price"];

                    obj.ImageDemoes.Add(image);
                    obj.SaveChanges();
                }
            }

            return Ok(true);
        }
    }
    catch (DbEntityValidationException dbEx)
    {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
            }
        }
    }

    return NotFound();
}

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

1 Ответ

0 голосов
/ 28 мая 2019

Ключ, который вы получаете из запроса, отличается от ключа данных формы, который вы отправляете.

formData.append("Imagename",name)
image.Name = Request["name"];

Он должен быть

image.Name = Request["Imagename"];

То же самое с другими несоответствиями.

Если это все еще не работает, я бы предложил альтернативу.Вы отправляете свои данные, используя данные формы, а также можете использовать атрибут FromForm.

Пример.

public IHttpActionResult UploadImage([FromForm]UploadDto dto)
{
    var postedFile = dto.File;
    var filePath = 
    HttpContext.Current.Server.MapPath("~/Images/" + postedFile.FileName);
    postedFile.SaveAs(filePath);

    ImageDemo image = new ImageDemo();
    image.Name = dto.Name;
    image.Image = postedFile.FileName;
    image.Number = dto.Number;
    image.Price = dto.Price;

    obj.ImageDemoes.Add(image);
    obj.SaveChanges();
}

public class UploadDto
{
    public string Name { get; set; }
    public int Number{ get; set; }
    public int Price{ get; set; }
    public IFormFile File{ get; set; }
}

Я уже давно использую этот подход, и он прекрасно работает.Помните, что ключ, который вы добавляете в данные формы, должен совпадать со свойствами вашей модели.

Надеюсь, это поможет.

...