2016-09-27 2 views
2

Я использую AngularJS для создания моего приложения. В нем у меня есть форма, которую пользователь может заполнить информацией. Это создает объект POST для базы данных с использованием WebAPI.Как отправить POST объект с файлом, прикрепленным в WebAPI?

Вот Угловой код:

$scope.test_object = 
{ 
    'Title': $scope.test_object.title, 
    'Description': $scope.test_object.description, 
}; 

// POST to the database 
$http.post(some_url, JSON.stringify($scope.test_object)).then(function (response) { 
     // do something 
    } 
); 

А вот мой класс в Visual Studio:

public class ClassName 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

Это работает, как это должно без проблем. Моя проблема заключается в том, что форма имеет возможность прикреплять файл. У меня есть контроллер в Visual Studio, чтобы отправить файл, вот код:

public class FileUploadController : ApiController 
{ 

    [Route("api/upload")] 
    public async Task<HttpResponseMessage> Post() 
    { 
     try 
     { 
      if (!Request.Content.IsMimeMultipartContent()) 
      { 
       throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
      } 

      //Save To this server location 
      var uploadPath = HttpContext.Current.Server.MapPath("~/Data"); 

      //Save file via CustomUploadMultipartFormProvider 
      var multipartFormDataStreamProvider = new CustomUploadMultipartFormProvider(uploadPath); 

      // Read the MIME multipart asynchronously 
      await Request.Content.ReadAsMultipartAsync(multipartFormDataStreamProvider); 

      // Show all the key-value pairs. 
      foreach (var key in multipartFormDataStreamProvider.FormData.AllKeys) 
      { 
       foreach (var val in multipartFormDataStreamProvider.FormData.GetValues(key)) 
       { 
        Console.WriteLine(string.Format("{0}: {1}", key, val)); 
       } 
      } 

      //In Case you want to get the files name 
      //string localFileName = multipartFormDataStreamProvider 
      // .FileData.Select(multiPartData => multiPartData.LocalFileName).FirstOrDefault(); 

      return new HttpResponseMessage(HttpStatusCode.OK); 
     } 
     catch (Exception e) 
     { 
      return new HttpResponseMessage(HttpStatusCode.NotImplemented) 
      { 
       Content = new StringContent(e.Message) 
      }; 
     } 
    } 
} 

Я нашел этот код в Интернете, и это работает для отправки файлов. Это отправляет любой файл в указанную папку (/ Данные).

Теперь мой вопрос: как создать связь между объектом и вложением? Как определить, какие файлы связаны с каждым объектом? Я как-то отправляю идентификатор объекта вместе с файлом?

Спасибо за любую помощь.

ответ

1

Что вы можете сделать в этих ситуациях, это сохранить адрес, в котором файл хранится в свойстве объекта. Таким образом, для случаев, вы могли бы добавить свойство к классу так:

public class ClassName 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string FilePath { get; set; } 
} 

И тогда, когда вы пишете свой файл в каталог скопировать адрес файла свойству FilePath.

Смежные вопросы