Я выполняю следующие действия.
- Я получаю переменную dataURL из Fabric.Canvas с помощью метода toDataURL.
dataURL = Canvas.toDataURL({
format: 'bmp ',
качество: 1.0
}); - Я извлекаю только ту строку, которая содержит «данные».
dataURLto64 = dataURL.substr(dataURL.lastIndexOf(',') + 1,
dataURL.length -
dataURL.lastIndexOf(',') - 1); - Вышеописанное делается на клиенте. На сервере мне нужно было сохранить строку по сегментам в текстовом файле TXT. Я проверил, что окончательное содержимое текстового файла идентично исходному dataURLto64 (в Base-64).
- Я извлекаю содержимое текстового файла.
Код: Выделить всё
string strtextfile64 = File.ReadAllText([path]);
- Я преобразую эту строку в массив байтов с помощью метода Convert.FromBase64String
Код: Выделить всё
fileBinary = Convert.FromBase64String(strtextfile64);
File.WriteAllBytes([path], fileBinary);
Чтобы проверить правильность строки Base-64, я включил следующую проверку на сервере.
Код: Выделить всё
int mod4 = strtextfile64.Length % 4;
if (mod4 > 0) {
strtextfile64 += new string('=', 4 - mod4);
}
Прикрепляю два текстовых файла, в которых исходный (клиент) и конечный ( сервер) Содержатся строки Base-64.
Исходный клиент
Конечный сервер
Может ли кто-нибудь сказать мне причину, по которой этот Base-64 данные, преобразованные в двоичные данные, не соответствуют требованиям с исходным форматом BMP из исходного файла BMP, созданного из Fabric.Canvas?
Изменить, чтобы добавить клиентский код, который я использую для передачи файла изображения на сервер.
КЛИЕНТ
Я делаю отправку с помощью Ajax, и когда он получает ответ от сервера с данными имени файла и последней позицией отправленного символа, отправка повторяется до тех пор, пока последняя позиция не превысит длину строка.
Код: Выделить всё
async function exportarCanvasF1(nombrearchivo, start_) {
let start = Number(start_);
var chunkSize = 90000; // size of each chunk
let start_limite = (start == 0 ? Number(start_) :
Number(start_)) + chunkSize;
if (start_limite > dataURL.length) {
start_limite = (start_limite - (start_limite - dataURL.length - 1));
}
if (Number(start) + chunkSize > dataURL.length) {
chunkSize = chunkSize - ((Number(start) + chunkSize) - dataURL.length) + 1; }
let dataURL_;
if (Number(start) < dataURL.length) {
dataURL_ = dataURL.substr(start, chunkSize);
dataURL_ = encodeURI(encodeURI(dataURL_));
$.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) {
}
});
}
else if (!Number(start) < dataURL.length) {
dataURL_ = dataURL.substr(start, chunkSize);
console.log("Length chunk: " + dataURL_.length);
dataURL_ = encodeURI(encodeURI(dataURL_));
$.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);
$.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) {
}
});
}
},
error: function (req, status, error) {
alert("No hubo respuesta desde el servidor. Prueba otra vez.");
}
});
}
}
Параметры «параметр», «значение», «таблица», «поле», «критерий» используются в подпрограмме для предоставить метод на сервере.
Метод выполняет следующее.
Код: Выделить всё
public string TroceadoFileBase64(string base64file, string nombrefile, string start)
{
string jsonDevolucion = "";
string base64filedec = HttpUtility.UrlDecode(base64file);
string base64filedec1 = HttpUtility.UrlDecode(base64file);
byte[] b = null;
System.Text.ASCIIEncoding codificador = new
System.Text.ASCIIEncoding();
b = codificador.GetBytes(base64filedec1);
CrearfiledesdeArray(b, nombrefile);
string[,] devolucion = new string[2, 2]; // 2 bloques de 2 datos
devolucion[0,0] = "nombrefile";
devolucion[0,1] = nombrefile;
devolucion[1,0] = "start";
devolucion[1,1] = start;
jsonDevolucion = JsonConvert.SerializeObject(devolucion);
return jsonDevolucion;
}
public string TroceadoFileBase64_fin(string nombrefile)
{
string strtextfile = File.ReadAllText((string)HttpContext.Current.Server.MapPath("~") + "google/archivoseditados/" + Left(nombrefile, nombrefile.Length - 4) + ".txt");
int mod4 = strtextfile.Length % 4;
if (mod4 > 0)
{
strtextfile += new string('=', 4 - mod4);
}
byte[] b = null;
b = Convert.FromBase64String(strtextfile);
File.WriteAllBytes((string)HttpContext.Current.Server.MapPath("~") + "google/archivoseditados/" + nombrefile, b);
return "Finalizado";
}
public void CrearfiledesdeArray(Byte[] array, string nombrefile)
{
FileStream fs = new FileStream((string)HttpContext.Current.Server.MapPath("~") + "google/archivoseditados/" + Left(nombrefile, nombrefile.Length - 4) + ".txt", FileMode.Append);
fs.Seek(0, SeekOrigin.End);
fs.Write(array, 0, array.Length);
fs.Flush();
fs.Dispose();
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-binary