2016-04-26 2 views
1

Я использую запрос POST с телом для динамического создания указанного файла на стороне сервера и передачи его клиенту в качестве ответа. Проблема на стороне клиента заключается в том, что файл загружается в объект ответа (кэш-память браузера, предположим, как временный файл) вместо жесткого диска ПК.Force browser загрузить большой файл

Как передать поток байтов непосредственно для браузера, чтобы обрабатывать и направлять его в папку/Downloads или куда пользователь загрузил файлы?

Размер файла действительно большой, и на жестком диске гаджета недостаточно места для его создания и предоставления ссылки для запроса GET. Поэтому мне нужно создать его на лету и передать клиенту как ответ POST.

Прямо сейчас я написал свой код в Angular, но язык не имеет большого значения. Я хотел бы понять, как браузер справляется с ситуацией.
Когда я выполняю HTTP-запрос, я уверен, что браузер что-то делает с ним, прежде чем он будет передан в сокет. И я уверен, что браузер делает что-то с полученным запросом, прежде чем передать его фрагменту кода, который выполнил запрос.

Я имею в виду, можете ли вы только установить заголовки ответов, чтобы браузер загрузил файл в/Downloads? Что происходит тогда с ожидающим HTTP-запросом, если пакеты «украдены» браузером? Или когда заголовки ответов поступают в объект ответа, можете ли вы каким-либо образом уведомить браузер о том, что тело ответа является файловым потоком байтов, который мы хотим загрузить в/Загрузки?

И у меня есть возможность изменить код сервера.

EDIT Более подробное объяснение:
Мой сервер посылает файл 5GB клиенту. Вместо того, чтобы просто получать этот файл во временной памяти браузера, я хотел бы сохранить файл непосредственно на жестком диске.
Но, естественно, браузер предотвращает прямой доступ к компьютеру пользователей, поэтому я не могу его там написать. Итак, как мне передать поток байтов для браузера, чтобы обрабатывать и сохранять в файл?

+0

Вы не можете. Место загрузки определяется Клиентом. «Этот ПК/Загрузки» обычно используется по умолчанию в Windows, но Клиент может решить что-то еще. – PHPglue

+0

Какова цель загрузки файла в определенную папку в пользовательской файловой системе? – guest271314

+0

Проблема заключается в том, чтобы загрузить файл на ПК в целом, а не загружать его по определенному пути. Сейчас я могу загрузить файл только в кэш-память браузера, и он не загружается на жесткий диск ПК. Надеюсь, это немного прояснилось. – user3622167

ответ

0

Хорошо, я решил проблему. Поэтому, если вы отправляете запрос файла самому себе на сервер с вашего кода javascript, браузер просто передаст полученный ответ непосредственно вашему объекту ответа, но вы не сможете его сохранить на жестком диске без каких-либо внешних (поддерживаемых браузером) инструментов.

Я имею в виду, что если вы выполняете какие-либо $ http.post() или .get() из своих скриптов, ответ будет передан в $ http.post(), а затем (function (response) { ...}) и передается только после получения всего ответа. Это означает, что если вы ожидаете файл размером 5 ГБ, он не будет слишком большим для приема внутри объекта ответа.

Вместо этого вам нужно запустить загрузку по-другому. То, что я сделал в моем коде, что я построил скрытый

<form method="POST" action="/set.uri.here/" id="download">...</form> 

и когда пользователь нажимает на кнопку, чтобы загрузить файл, я запустить функцию, которая строит тело формы, а затем передает его. Который выглядит

var form = document.getElementById("download"); // magic here... create the body for the form and so on form.submit();

Таким образом, вы можете передать запрос быть сделано в вашем браузере, чтобы потом ответ будет также обрабатываются браузером. Это ключевое различие между выполнением запроса самостоятельно или браузером.Если вы сделаете запрос самостоятельно, браузер не будет загружать объект, но вы его сами получите, чтобы что-то сделать с ним.

Если вы хотите, чтобы браузер загрузил объект, сделайте запрос обозревателя и для этого объекта!

Смежные вопросы