К вашему сведению:
Так и не узнал почему $http
не работает .. даже странные вещи по этой теме находил.
Итак, сначала я "извлек" файл из html следующим образом:
<input flex="40" type="file" onchange="angular.element(this).scope().$parent.selectAttachment(this)">
потому что я не хотел создавать директиву для этой цели тестирования. Функция selectAttachment
просто устанавливает файл как свойство для моего контроллера.
Тогда вроде бы все было нормально, я мог читать, например, this.attachment.name
или this.attachment.size
, но когда я написал $http.put(url, this.attachment)
, я получил ошибку несоответствия подписи.
Затем я попробовал то же самое с XHR, как в этом руководстве: https://devcenter.heroku.com/articles/s3-upload-node
Никогда не везет ...
Затем, в крайнем случае, я попытался получить файл, установив его не через angular, а через const file = document.getElementById('report-attachment').files[0];
, и, наконец, у меня это сработало. Интересно, что получение файла с getElementById
И с использованием $ http по-прежнему не работает, ни 1, ни 2 сторонних угловых загрузчика, которые я пробовал, только с XHR o.o
Окончательное «решение», которое мне подходит:
HTML:
<input flex="40" id="report-attachment" type="file">
JS:
const file = document.getElementById('report-attachment').files[0];
const url = r && r.data;
const xhr = new XMLHttpRequest();
xhr.open('PUT', url);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
console.debug('success');
} else {
console.error('error');
}
}
};
xhr.send(file);
person
Jim-Y
schedule
04.01.2017