Я использую Chrome, где отправка ReadableStream в виде октетного потока поддерживается. Если я предоставлю ReadableStream в качестве body для fetch, все будет работать. Однако, если я append это FormData, как показано ниже, и вместо этого предоставлю это, это не сработает.
async function main() {
const blob = new Blob([new Uint8Array(10 * 1024 * 1024)]);
const body = new FormData();
body.append("file", blob.stream());
await fetch(..., {
method: "POST"
body: body,
duplex: "half",
});
}
Это потому, что из прикрепите документацию:
Если значение не является строкой или Blob,
append()автоматически преобразует его в строку:
Итак, file в моей форме данные приводятся к буквальному тексту [object ...], а не к фактическим двоичным данным потока.
Как я могу транслировать blob, используя данные формы? Мне приходится иметь дело с blob.stream(), так как мой вариант использования требует ReadableStream.
@chrwahl Чтобы убедиться, что я правильно понял, вы думаете полностью обойти FormData и собрать большой двоичный объект в соответствии со спецификацией данных многочастной формы (то есть границами и всем остальным), из которого затем создается ReadableStream?
Да, я предполагаю, что этот пакет может превратить объект fordata в multipart/form-data, но я думал о более «низком уровне», например, о создании контента вручную — что-то вроде этого ответа: stackoverflow.com/a /23517227/322084 где вы можете увидеть структуру POST-запроса с типом контента multipart/form-data.
«и сборка большого двоичного объекта в соответствии со спецификацией данных многочастной формы (то есть границ и всего остального), из которого затем создается ReadableStream?». Да, точно. Это сработает?
@chrwahl, это определенно отличная идея, я попробую и посмотрим. Спасибо!
@chrwahl Это сработало отлично! В качестве оптимизации я избегал создания больших двоичных объектов и вместо этого создал читаемый поток из асинхронного итератора (который дает границы, заголовки и фрагменты данных), так что ничего не буферизуется. Если вы хотите перенести свой комментарий на быстрый ответ, я с радостью приму это.
ОК, я ответил. Возможно, вы сможете дополнить ответ некоторыми своими идеями.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Единственный способ увидеть эту работу — сделать данные формы (либо простое значение полей формы, либо объект FormData) частью большого двоичного объекта (а не части большого двоичного объекта документа FormData, JSON и т. д.). Возможно, создание содержимого multipart/form-data в виде большого двоичного объекта.
Как в этом ответе: https://stackoverflow.com/a/23517227/322084 где вы можете увидеть структуру запроса POST с типом контента multipart/form-data.
Единственный способ увидеть эту работу — сделать данные формы частью большого двоичного объекта (а не части большого двоичного объекта FormData, документа JSON и т. д.). Возможно, создание содержимого multipartform-данных в виде большого двоичного объекта.