Как передать бинарный файл Java Servlet -> html (js)

161
04 октября 2018, 15:40

С сервлета на клиент необходимо отправить торрент-файл. В JS не силён. По примерам в интернете скопипастил такой код.

            function downloadFile() {  
                var data;
                var xmlHttp = getXHR();
                var date = new Date();
                date = Date.parse(date);
                xmlHttp.open("GET", "/index?request=dld&sessid=" + date, false);
                xmlHttp.onreadystatechange = function() {
                    if(xmlHttp.readyState == 4) {
                        if(xmlHttp.status == 200) {
                            data = this.response;
                            saveData(data, fileName); //код получения fileName опускаю
                        }
                    }
                };
                xmlHttp.send(null);
            }
            function getXHR() {
                var xmlHttp;
                try {
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
                    } catch (E) {
                        xmlHttp = false;
                    }
                }
                if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
                    xmlHttp = new XMLHttpRequest();
                }
                return xmlHttp;
            }
            var saveData = (function () {
                debugger;
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.style = "display: none";
                return function (data, fileName) {
                    var blob = new Blob([data], {type: "octet/stream"}),
                    url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = fileName;
                    a.click();
                    window.URL.revokeObjectURL(url);
                };
            }());

код сервлета:

            String path = "--any path--";
            OutputStream outputStream = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(path);
            while(inputStream.available() > 0){
                outputStream.write(inputStream.read());
            }
            inputStream.close();
            outputStream.close();

Файл сохраняется ломаный. Если просто открыть в текстовом или hex редакторе, то начало файла, где перечисляются трекеры, сходится с исходным, а дальше, где бинарная информация, идет явное отличие.

Answer 1

Решено

Несмотря на то, что минусуют, я всё же отвечу. Вдруг, кому поможет. Для объекта XMLHttpRequest необходимо указать тип принимаемых данных. В моём случае

xmlHttp.responseType = "arraybuffer";

Данная настройка работает только с асинхронным запросом. По умолчанию xmlHttp.responseType = "" (DOMString), что и приводит к изменению данных.

READ ALSO
Проблема с innerHTML в JS:(

Проблема с innerHTML в JS:(

Мне нужно изменить обе строки в html, но с помощью innerHTML получается изменить лишь одну строку (ту, где единица написана)

142
Вывод информации из таблицы mysql

Вывод информации из таблицы mysql

Использую библиотеку mysqldb

183
MySQL выборка из БД

MySQL выборка из БД

Таблица books (id, name)

170
Как поменять пароль у root'a в mysql?

Как поменять пароль у root'a в mysql?

Всем привет При установка mysql

183