carga de archivos con $ http

¿Es esta pregunta demasiado difícil?

Tengo el código del lado de mi cliente con las variables de datos de publicación, y me pregunto cómo puedo agregar datos de archivo a $http.post .

He visto algunos ejemplos y están utilizando una directiva personalizada o un envío manual de formularios, ninguno de los cuales estoy buscando.

Lado del cliente:

  //file can be accessed using var photo = document.getElementById("photo").files[0]; $scope.data.photo = photo 

O

 var formData = new FormData(); formData.append("photo", photo); formData.append("title", $scope.data.title); this.delegate.insert(formData); 

Despachado al servicio

 $http.post("/admin/speakers/?" + data, token.body) //token.body = $scope.data .success(function(data, status, headers, config) { }) .error(function(data, status, headers, config) { }); 

Esperando el lado del servidor de salida (producido mediante POSTMAN, un cliente REST)

 console.log(request.files, request.body); { photo: { fieldname: 'photo', originalname: '01.jpg', name: 'fbb54fa6d588ac253ca7dab08a904356.jpg', encoding: '7bit', mimetype: 'image/jpeg', path: '/var/folders/jg/hkmz0fdn64g8w1jgf60j2lcw0000gn/T/fbb54fa6d588ac253ca7dab08a904356.jpg', extension: 'jpg', size: 12279, truncated: false, buffer: null } } { name: 'SA', title: 'Dev', company: 'CA', bio: 'some bio', twitter: '@twitter', sessionId: '1' } 

Intente configurar el Content-Type header como undefined y transformRequest como angular.identity (para no serializar el objeto FormData):

 $http.post("/admin/speakers/?" + data, token.body, { transformRequest: angular.identity, headers: { 'Content-Type': undefined } }).success(function(data, status, headers, config) { }).error(function(data, status, headers, config) { }); 

La función transformRequest predeterminada de Angular intentará serializar nuestro objeto FormData, por lo que la reemplazamos con la función de identidad para dejar los datos intactos. El encabezado de tipo de contenido predeterminado de Angular para las solicitudes POST y PUT es application / json, por lo que también queremos cambiar esto. Al configurar ‘Tipo de contenido’: indefinido, el navegador configura el Tipo de contenido en varias partes / datos de formulario para nosotros y completa el límite correcto. Configuración manual de ‘Tipo de contenido’: multipart / form-data no completará el parámetro de límite de la solicitud.

( https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs )