Загрузка файла вместе с другими параметрами в ASP.NET MVC, Web API и Entity Framework - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу загрузить и сохранить файл вместе с другими пользовательскими данными, имеющими тип данных int, string и datetime. Я хотел бы сохранить файл на жестком диске и сохранить путь и другие входные данные в таблице базы данных SQL Server. Я получаю AggregateException всякий раз, когда пытаюсь сделать оба вместе. Я новичок в ASP.NET MVC и веб-API.

Ниже приведен мой метод действия в проекте ASP.NET MVC.

public ActionResult AddOrEdit(mvcCandidate cn)
{
    if (cn.ID == 0)
    {
        if (cn.cvFile.ContentLength != 0)
        {
            string filename = Path.GetFileNameWithoutExtension(cn.cvFile.FileName);
            string extension = Path.GetExtension(cn.cvFile.FileName);
            filename = filename + DateTime.Now.ToString("yymmssff") + extension;
            cn.path = "~/Uploads/" + filename;
            filename = Path.Combine(Server.MapPath("~/Uploads/"), filename);
            cn.cvFile.SaveAs(filename);
        }
        else
            cn.path = "";
        try
        {
            HttpResponseMessage response = GlobalVariables.WebApiClient.PostAsJsonAsync("Candidates", cn).Result;
        }
        catch (AggregateException ex)
        {
            var ch = ex.Message;
            return null;
        }         
    }
}

И это метод действия в проекте WebAPI

public IHttpActionResult PostCandidate(Candidate candidate)
{
    db.Candidates.Add(candidate);
    db.SaveChanges();
    return CreatedAtRoute("DefaultApi", new { id = candidate.ID }, candidate);
}

Класс модели выглядит следующим образом:

public class mvcCandidate
{
    public int ID { get; set; }
    [Display(Name="Name")]
    public string Name { get; set; }
    [Display(Name = "Address")]
    public string Adress { get; set; }    
    [Display(Name = "Date Of Birth")]
    [DataType(DataType.Date)]
    public Nullable<System.DateTime> DOB { get; set; }
    public string PIN { get; set; }
    public Nullable<int> CompanyID { get; set; }
    [Display(Name = "CV")]
    public string path { get; set; }
    public HttpPostedFileBase cvFile { get; set; }           
    public virtual mvcCompany Company { get; set; }
}

1 Ответ

0 голосов
/ 24 апреля 2018

Я изо всех сил пытался сохранить файл с данными при работе с Web API, поэтому мне удалось решить эту проблему, взяв свойства и файл из текущего HttpContext, я знаю, что использовать связывание намного проще, однако таким образом у меня сработало, поэтому контроллер (код контроллера API) для сохранения файла:

    [HttpPost]
    public IHttpActionResult SaveFileWithData()
    {
        try
        {
            var httpRequest = HttpContext.Current.Request;
            #region Get entity data
            var entity = new EntityClass();
            entity.Name = httpRequest.Params["name"];

            //here you put the saving code into entity framework aka Context.Entity.Add(entity); Context.SaveChanges();

            #endregion

            if (httpRequest.Files.Count > 0)
            {
                var myFile = httpRequest.Files[0];

                var filePath = HttpContext.Current.Server.MapPath($"~/Files/{ myFile.FileName}");
                //Set the file into server
                myFile.SaveAs(filePath);
            }
            return Ok();
        }
        catch (Exception ex)
        {
            return InternalServerError();
        }
    }

И при отправке данных от клиента я использовал форму Multipart следующим образом:

Test API using RESTFull client

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