mitchzzzz Ответов: 1

Как получить двоичные данные с помощью AJAX


Привет,

Может ли кто-нибудь помочь мне в следующем?

У меня есть очень простой тестовый Java сервлет следующим образом:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
        byte[] bytes = GetNumbers1to10AsBinaryDataFromAFile() // My function to get bytes of {1,2,3,4,5,6,7,8,9,10} written as doubles to a binary file.
		        
		        response.setContentType("application/octet-stream");
		        response.setContentLength(bytes.length);
				
				ServletOutputStream servletOutputStream = response.getOutputStream();
				
				servletOutputStream.write(bytes, 0, bytes.length);
			    servletOutputStream.flush();
			    servletOutputStream.close();
}


Это прекрасно работает. Я знаю это, потому что я вызываю его из приложения C#, как показано ниже:

public static bool CallWebServiceDownloadEndPoint(string szWebEndPoint, string szRequest, out double[] data)
        {
            data = null;

            bool bSuccess = true;

            WebClient webClient = new WebClient();

            try
            {
                byte[] byteData = webClient.DownloadData(szWebEndPoint + "?" + szRequest);
                Array.Reverse(byteData);

                data = CreateDoubleArrayFromByteArray(byteData);
                Array.Reverse(data);
            }
            catch
            {
                bSuccess = false;
            }

            return bSuccess;
        }


Работать отлично. Я получаю 80 байт данных, как и ожидалось (8 * 10 двойников), и цифры такие, какими они должны быть.

Моя проблема в том, как я могу вызвать это с помощью AJAX из javascript?

У меня есть следующее:

function AJAXSendString2(ajaxRequestObject, szURL, szParams, OnCallCompleted)
    {
    if (ajaxRequestObject != null)
                    {
                        ajaxRequestObject.open("GET", szURL, true);

                        ajaxRequestObject.responseType = "arraybuffer";

                        ajaxRequestObject.onload = function(oEvent)
                        {
                            var arrayBuffer = ajaxRequestObject.response;

                            if(arrayBuffer)
                            {
                                var byteArray = new Uint8Array(arrayBuffer);

                                alert(byteArray.byteLength);
                            }
                        }

                        /*ajaxRequestObject.onreadystatechange = function ()
                        {
                            if (ajaxRequestObject.readyState == 4)
                            {
                                if (ajaxRequestObject.status == 200)
                                {
                                    var arrayBuffer = ajaxRequestObject.response;

                                    if(arrayBuffer)
                                    {
                                        var byteArray = new Uint8Array(arrayBuffer);

                                        alert(byteArray.byteLength);
                                    }
                                }
                            }
                        }*/

                        ajaxRequestObject.send(szParams);
                    }

}


Не имеет значения, использую ли я раскомментированный код или комментированный код. Результат оповещения-19, а я ожидаю 80. Я делаю что-то не так?

Наконец, если я когда-нибудь заставлю его работать, как я могу использовать javascript для преобразования bytearray в Double? (плавает?).

Спасибо за любую помощь,
Митч.

Что я уже пробовал:

Как показано выше. Я протестировал сервлет из c# и попробовал два разных способа вызвать его в JavaScript. Оба дают мне byteArray. byteLength os 19, а не 80.

ZurdoDev

Что вы будете делать с байтовыми данными в JavaScript?

1 Ответов

Рейтинг:
2

Latlon Technologies

новый Аякс.Запрос ('/viewImage?id=123', {
// request возвращает двоичное изображение inputstream
onSuccess: функция (транспорт) {
// текстовый пример
// оповещения(транспорт.responseText)

// Вопрос: существует ли потоковый двоичный ответ?
$('imgElem'). src = transport.responseBinary;
},
onFailure: функция (транспорт) {
// отказ ручки
}
});