Проблема с отправкой большого графического файла в формате Base-64 с помощью toDataURL и Ajax.C#

Место общения программистов C#
Ответить
Anonymous
 Проблема с отправкой большого графического файла в формате Base-64 с помощью toDataURL и Ajax.

Сообщение Anonymous »

Мне нужно отправить на сервер графический файл размером 60 МБ. Это происходит из объекта Fabric.Canvas, в который я внес изменения, добавив фигуры.
Для этого я получаю строку с содержимым, возвращаемым методом toDataURl().

Код: Выделить всё

dataURL = canvas.toDataURL({
format: 'bmp',
quality: 1.0
});
Из этой строки я извлекаю только содержимое Data, которое представляет собой графический файл в формате Base-64.

Код: Выделить всё

dataURL = dataURL.substr(dataURL.lastIndexOf(',') + 1, dataURL.length - dataURL.lastIndexOf(',') - 1);
Поскольку это большой файл, я отправляю его с помощью Ajax, разрезая строку. Каждая новая отправка запускается только после того, как сервер подтвердит, что отправка была отправлена ​​обратно и был выполнен метод, обрабатывающий отправленную строку.

Код: Выделить всё

 async function exportarCanvasF1(nombrearchivo, start_) {

const chunkSize = 90000; // size of each chunk
let start = Number(start_);
let start_limite = (start == 0 ? Number(start_) : Number(start_) + 1) + chunkSize;
if (start_limite > dataURL.length) {
start_limite = (start_limite - (start_limite - dataURL.length - 1));
}
let dataURL_;

if (Number(start) < dataURL.length) {
dataURL_ = dataURL.substr(start, chunkSize);

$.ajax({
type: "POST",
url: "Respuestaajax.aspx/Respuestaaj",
contentType: "application/json; charset=utf-8",
data: '{"parametro":"funcion","valor":"TroceadoFileBase64","tabla":"' + dataURL_ + '","campo":"' + nombrearchivo + '","criterio":"' + start_limite + '","v1":""}',
dataType: "json",
success: function (devolucion) {
if (devolucion.d) {
var d = JSON.parse(devolucion.d);
exportarCanvasF1(d[0][1], d[1][1]);
}
},
error: function (req, status, error) {
alert("No hubo respuesta desde el servidor. Prueba otra vez.");
}
});
}
else if (!Number(start) < dataURL.length) {
$.ajax({
type: "POST",
url: "Respuestaajax.aspx/Respuestaaj",
contentType: "application/json; charset=utf-8",
data: '{"parametro":"funcion","valor":"TroceadoFileBase64_fin","tabla":"' + nombrearchivo + '","campo":"","criterio":"","v1":""}',
dataType: "json",
success: function (devolucion) {
if (devolucion.d) {
}
},
error: function (req, status, error) {
alert("No hubo respuesta desde el servidor. Prueba otra vez.");
}
});
}
}
Я проверяю на сервере, что строка Base-64 идентична изначально сгенерированной на клиенте, значит передача прошла успешно.
При каждой отправке Ajax данные записываются в файл TXT. Наконец, я получаю полное содержимое этого текстового файла с помощью File.ReadAllText.
Чтобы создать графический файл на сервере, я конвертирую Base-64 в байтовый массив с помощью метода Convert.FromBase64String и затем передайте этот массив в качестве параметра File.WriteAllBytes.

Код: Выделить всё

string strtextfile = File.ReadAllText((string)HttpContext.Current.Server.MapPath("~") + "google/archivoseditados/" + Left(nombrefile, nombrefile.Length - 4) + ".txt");

byte[] b = null;

b = Convert.FromBase64String(strtextfile);

File.WriteAllBytes((string)HttpContext.Current.Server.MapPath("~") + "google/archivoseditados/" + nombrefile, b);
Иногда файл BMP создается, но почти всегда выдается ошибка «Длина строки недопустима для строки Base-64».
Интересно, имеет ли метод toDataURL() какие-либо ограничения на максимальный размер, который он может обработать.
Я все просмотрел и увидел, что строка Base-64 идентична данным, сгенерированным в клиенте, нельзя думать, что трансфер состоялся ошибочен или внес изменения.
Причина отправки файла через Ajax таким способом заключается в том, что источником является Fabric.Canvas, а не объект File или существующий файл. Мне нужны изменения, внесенные в ткань. Холст.

Подробнее здесь: https://stackoverflow.com/questions/792 ... l-and-ajax
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»