Если вы используете Java 1.4, вы можете сделать следующее:
System.out.println(Arrays.asList(array));
(это тоже работает в 1.5+).
Я использовал следующий код для загрузки больших файлов в куски от 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; }
}
Я столкнулся с той же проблемой и после серии 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. Отмените все неиспользуемые переменные и содержимое массива байтов в файле, когда они больше не нужны.
Пожалуйста, дайте мне знать, если я ошибаюсь.
Измените действие вашего контроллера, чтобы принять 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.
Может быть альтернатива, например, фильтр или атрибут или что-то в этом роде, но это самый простой способ узнать.
Основываясь на решении user1084447 (сериализация и десериализация на строку base64), это очень хорошо подходит для сериализации:
var serialized = fromByteArray(myUint8Array);
Если функция fromeByteArray
поступает из , этот проект github . Я узнал о base64-js из этой документации по mdn .
Я не смог изменить сервер, поэтому мне нужно было сохранить тип byte[]
на конечной точке сервера. Чтобы решить эту проблему, я преобразовал свой Uint8Array
в простой массив байтов, который JSON анализирует как массив вместо объекта.
const byteArray = [];
Object.keys(contentUint8Array).forEach((key) =>{
const byteForKey = contentUint8Array[key];
byteArray.push(byteForKey);
});
Таким образом, конечная точка .Net смогла десериализовать к массиву Byte
.
На данный момент единственным способом, который я мог бы сделать, было: 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);
}
вы должны использовать 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
}