Отправляйте файлы multipart/form-data с помощью angular, используя $http
Я знаю, что в этом есть много вопросов, но я не могу заставить это работать:
Я хочу загрузить файл со входа на сервер в multipart/form-datap >
Я пробовал два подхода. Во-первых:
headers: {
'Content-Type': undefined
},
что приводит к, например, для изображения
Content-Type:image/png
в то время как он должен быть multipart/form-datap >
а другой:
headers: {
'Content-Type': multipart/form-data
},
Но это требует заголовка границы, который, я считаю, не должен быть вставлен вручную...
Что такое чистый способ решить эту проблему?
Я читал, что вы можете сделать
$httpProvider.defaults.headers.post['Content-Type'] = 'multipart/form-data; charset=utf-8';
Но я не хочу, чтобы все мои сообщения были multipart/form-data. По умолчанию должен быть JSON
Ответы
Ответ 1
Взгляните на объект FormData:
https://developer.mozilla.org/en/docs/Web/API/FormData
this.uploadFileToUrl = function(file, uploadUrl){
var fd = new FormData();
fd.append('file', file);
$http.post(uploadUrl, fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
})
.error(function(){
});
}
Ответ 2
Здесь обновленный ответ для Angular 4 & 5. TransformRequest и angular.identity были удалены. Я также включил возможность объединения файлов с данными JSON в одном запросе.
Решение Angular 5:
import {HttpClient} from '@angular/common/http';
uploadFileToUrl(files, restObj, uploadUrl): Promise<any> {
// Note that setting a content-type header
// for mutlipart forms breaks some built in
// request parsers like multer in express.
const options = {} as any; // Set any options you like
const formData = new FormData();
// Append files to the virtual form.
for (const file of files) {
formData.append(file.name, file)
}
// Optional, append other kev:val rest data to the form.
Object.keys(restObj).forEach(key => {
formData.append(key, restObj[key]);
});
// Send it.
return this.httpClient.post(uploadUrl, formData, options)
.toPromise()
.catch((e) => {
// handle me
});
}
Решение Angular 4:
// Note that these imports below are deprecated in Angular 5
import {Http, RequestOptions} from '@angular/http';
uploadFileToUrl(files, restObj, uploadUrl): Promise<any> {
// Note that setting a content-type header
// for mutlipart forms breaks some built in
// request parsers like multer in express.
const options = new RequestOptions();
const formData = new FormData();
// Append files to the virtual form.
for (const file of files) {
formData.append(file.name, file)
}
// Optional, append other kev:val rest data to the form.
Object.keys(restObj).forEach(key => {
formData.append(key, restObj[key]);
});
// Send it.
return this.http.post(uploadUrl, formData, options)
.toPromise()
.catch((e) => {
// handle me
});
}
Ответ 3
В Angular 6 вы можете сделать это:
В вашем сервисном файле:
function_name(data) {
const url = 'the_URL';
let input = new FormData();
input.append('url', data); // "url" as the key and "data" as value
return this.http.post(url, input).pipe(map((resp: any) => resp));
}
В файле component.ts:
в любой функции сказать XYZ,
xyz(){
this.Your_service_alias.function_name(data).subscribe(d => { // "data" can be your file or image in base64 or other encoding
console.log(d);
});
}