Я отправляю FormData
(включая файлы) на сервер, который отклоняет запросы с длиной содержимого, превышающей определенный предел. Я хотел бы проверить длину содержимого в моем клиенте JavaScript (браузере) перед выполнением запроса, который обречен на отклонение. Как получить длину содержимого моего (multipart/form-data
) закодированного объекта FormData
?
const formData = new FormData();
formData.append('text', text);
formData.append('file', file);
if (getContentLength(formData) > limit) {
alert('Content length limit is exceeded');
} else {
fetch(url, { method: 'POST', body: formData });
}
Изменить: Спасибо за ответ, @Indgalante. Простое использование length
строки и size
файла не позволяет вычислить правильную длину содержимого.
function getContentLength(formData) {
const formDataEntries = [...formData.entries()]
const contentLength = formDataEntries.reduce((acc, [key, value]) => {
if (typeof value === 'string') return acc + value.length
if (typeof value === 'object') return acc + value.size
return acc
}, 0)
return contentLength
}
const formData = new FormData();
formData.append('text', 'foo');
alert(`calculated content-length is ${getContentLength(formData)}`);
fetch('https://httpbin.org/post', { method: 'POST', body: formData });
Вы не учли, что данные формы закодированы в запросе. Тем самым, в т.ч. граница добавлена. Расчетная длина содержимого в примере равна 3, но в моем браузере Chrome она должна быть 138.
и 172 в моем браузере Firefox. Я не уверен, как ведут себя другие браузеры.