#angular #httpclient #multipartform-data
#angular #httpclient #составная форма-данные
Вопрос:
У меня есть содержимое, которое я хочу опубликовать, доступное в строковой переменной. Я хочу использовать:
import { HttpClient } from '@angular/common/http'
… для достижения того же эффекта, что и:
curl -F "image=@blob.bin" someurl.com
… где содержимое моей строковой переменной будет тем, что может быть в локальном файле с именем `blob.bin. Я не уверен, как это сделать, но это не работает:
this.http.post('http://someurl.com', fileContents)
Как вы получаете этот эффект, используя Angular 7 и службу HttpClient? У меня нет фактической HTML-формы, с которой я взаимодействую, у меня просто есть некоторый предписанный двоичный / строковый контент, который мне нужно опубликовать, как если бы он был отправлен формой, которая выглядит так (что совпадает с тем, что делает curl выше):
<form method='POST' action='http://someurl.com' enctype='multipart/form-data'>
<input type='file' name='update'>
<input type='submit' value='Update'>
</form>
Я уверен, что это может быть достигнуто, просто возникли проблемы с выполнением правильных заклинаний.
Ответ №1:
Использовать FormData
const formData: FormData = new FormData();
formData.append('files', this.logo, this.logo.name);
this.http.post("upload", formData)
В примере this.logo
это File
объект. Вы можете получить объект file из своего ввода следующим образом:
<input (change)="handleLogoFileInput($event.target.files)" type="file" name="update />
и в файле компонента:
handleLogoFileInput(files: FileList) {
this.logo = files[0];
}
Комментарии:
1. У меня нет <input>, у меня просто есть необработанная строка / двоичный файл… как мне преобразовать его в файловый объект для отправки в FormData.append?
2. Мой плохой, я неправильно понял. Вы могли бы использовать
FileReader.readAsBinaryString()
для чтения вашего файла. После того, как вы приобретете файл, приведенный выше ответ должен сработать. developer.mozilla.org/en-US/docs/Web/API/FileReader /…3. Является ли ваша необработанная строка массивом байтов в кодировке base64? Или я бы назвал это именем файла?
4. @Pace это даже не кодирование base64, просто прямое двоичное содержимое
5. @Sayegh я понял это…
const formData: FormData = new FormData(); formData.append('image', new Blob([fileContents], { type: 'application/octet-stream' }), 'file.bin');