Вход Uint8Array недействителен [дубликат]

Если вы используете Java 1.4, вы можете сделать следующее:

System.out.println(Arrays.asList(array));

(это тоже работает в 1.5+).

4
задан user1084447 24 July 2013 в 22:21
поделиться

7 ответов

Я использовал следующий код для загрузки больших файлов в куски от Angular 5 до ASP Core Web API. На стороне клиента - преобразование ArrayBuffer в Base64String:

private arrayBufferToBase64String(buffer: ArrayBuffer) {
  let binaryString = ''
  var bytes = new Uint8Array(buffer);
  for (var i = 0; i < bytes.byteLength; i++) {
    binaryString += String.fromCharCode(bytes[i]);
  }

  return window.btoa(binaryString);
}

Проводка строки (это версия Angular 2+):

var data = {
  data: this.arrayBufferToBase64String(arrayBuffer)
}

this.httpClient.post(url, data)

На сервере (C #):

var bytes = Convert.FromBase64String(part.Data);

part является модельным классом:

public class FilePartModel
{
    public string Data { get; set; }
}
0
ответ дан Assaf S. 25 August 2018 в 05:32
поделиться

Я столкнулся с той же проблемой и после серии R & amp; D. Я пришел к нескольким выводам.

Подход 1: C # не может десериализовать массивы типов javascript (UInt8Array, UInt16Array и т. Д.). Данные должны быть скопированы в обычный массив Java-скриптов из типизированного массива и данные должны быть отправлены. В конце приема (метод конечной точки C #) параметр должен быть целым массивом вместо байтового массива. Если массив байтов помещен, данные, полученные в нулевой точке в конечной точке. Полученный целочисленный массив должен быть преобразован в массив байтов для восстановления файла.

Подход 2: Еще одна опция для отправки типизированных данных массива вместо копирования данных с типизированным массивом javascript в обычный массив - это отправить типизированные данные массива, поскольку это и на конце приема (метод конечной точки C #) параметр метода должен быть объектом. Этот объект должен быть итерирован с использованием некоторого linq и должен быть преобразован в массив байтов для восстановления файла.

Оба подхода, обнаруженные выше, очень медленны в зависимости от меня. Когда я отправляю 3 файла размером 5 МБ, мое потребление памяти браузера (IE 10) увеличивается экспоненциально, посылая данные через запрос Ajax. Я все еще не в состоянии разобраться в этом вопросе. Если кто-то может отправить массив байтов с помощью Ajax, пожалуйста, дайте мне знать.

Подход 3: Третий подход - преобразовать массив байтов в кодировку base64 и отправить его. Хотя это увеличивает размер файла на 33%, этот подход намного лучше, чем два выше. Я могу отправить файл размером 15 МБ, и потребление памяти браузером составляет 80 Мбайт при отправке этих 3-х файлов, а потребление становится меньше после отправки файлов.

Важно: Пожалуйста, освободите память от переменной после прочтения содержимое файла. Сбор мусора в IE не так уж хорош. Я столкнулся с множеством проблем с потреблением памяти после чтения файла с помощью fileReader. Отмените все неиспользуемые переменные и содержимое массива байтов в файле, когда они больше не нужны.

Пожалуйста, дайте мне знать, если я ошибаюсь.

3
ответ дан Jagadish Dharanikota 25 August 2018 в 05:32
поделиться

Измените действие вашего контроллера, чтобы принять int[] вместо byte[], а затем преобразовать в массив байтов. Значение post все равно может быть массивом JSON.

[HttpPost]
public async Task<JsonResult> SendByteArray(int[] myByteArray) {

     byte[] theBytes = myByteArray.Select(i => (byte)i).ToArray();

     // Or any one of a dozen other ways of converting it

}

Чтобы отправить в массив байтов, вам нужно будет закодировать байты на клиенте base-64 и передать его как string.

Может быть альтернатива, например, фильтр или атрибут или что-то в этом роде, но это самый простой способ узнать.

0
ответ дан Joe Enos 25 August 2018 в 05:32
поделиться

Основываясь на решении user1084447 (сериализация и десериализация на строку base64), это очень хорошо подходит для сериализации:

var serialized = fromByteArray(myUint8Array);

Если функция fromeByteArray поступает из , этот проект github . Я узнал о base64-js из этой документации по mdn .

0
ответ дан Jordan Wilcken 25 August 2018 в 05:32
поделиться

Я не смог изменить сервер, поэтому мне нужно было сохранить тип byte[] на конечной точке сервера. Чтобы решить эту проблему, я преобразовал свой Uint8Array в простой массив байтов, который JSON анализирует как массив вместо объекта.

            const byteArray = [];
            Object.keys(contentUint8Array).forEach((key) =>{
                const byteForKey = contentUint8Array[key];
                byteArray.push(byteForKey);
            });

Таким образом, конечная точка .Net смогла десериализовать к массиву Byte.

0
ответ дан mnille 25 August 2018 в 05:32
поделиться

На данный момент единственным способом, который я мог бы сделать, было: base64 закодировать Uint8Array, захватить его как строку в C #, а затем преобразовать эту строку в байт [].

JavaScript:

AJAX.Post('www.example.com/SendByteArray', { strByteArray: btoa(String.fromCharCode.apply(null, myUint8Array)) }, Callback);

C #:

[HttpPost]
public async Task<JsonResult> SendByteArray(string strByteArray) {
    byte[] myByteArray = Convert.FromBase64String(strByteArray);
}
4
ответ дан user1084447 25 August 2018 в 05:32
поделиться

вы должны использовать Json.stringify для сериализации и установить некоторый атрибут ajax. Это пример использования и работы

            var list = [];

           //Fill list array

            var parameters = {};
            parameters = JSON.stringify({ "Your parameter": list });
            jQuery.ajax({
                url: '@Url.Action("Your Action")';,
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                dataType: "html",
                traditional: true,
                data: parameters,
                success: function (data, textStatus, jqXHR) {
                   //TODO: on success
                },
                error: function (data) {
                       //TODO: on fail
                }    
            });

    [HttpPost]
    public async Task<JsonResult> SendByteArray(IEnumerable<byte> myByteArray) {

    }

     OR Do this Way

    [HttpPost]
    public async Task<JsonResult> SendByteArray(int[] myByteArray) {
      convert to byte here
    }
0
ответ дан Vahid Akbari 25 August 2018 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: