Проблема с неправильным форматом при преобразовании файла изображения BMP из Base-64 в двоичный формат.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с неправильным форматом при преобразовании файла изображения BMP из Base-64 в двоичный формат.

Сообщение Anonymous »

Я пытаюсь преобразовать данные Base-64, содержащиеся в «данных», возвращаемых toDataURL Fabric.Canvas, в файл с соответствующим расширением (BMP). В результате появляется ошибка «Файл имеет неверный формат».
Я выполняю следующие действия.
  • Я получаю переменную 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
byte[] fileBinary = null;

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

fileBinary = Convert.FromBase64String(strtextfile64);

File.WriteAllBytes([path], fileBinary);
Я проверил, что dataURLto64 и strtextfile64 имеют одинаковые символы и один и тот же номер.
Чтобы проверить правильность строки Base-64, я включил следующую проверку на сервере.

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

 int mod4 = strtextfile64.Length % 4;

if (mod4 > 0) {
strtextfile64 += new string('=', 4 - mod4);
}
Изменять strtextfile64 не было необходимости, поскольку mod4 = 0.
Прикрепляю два текстовых файла, в которых исходный (клиент) и конечный ( сервер) Содержатся строки 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();

}

Метод TroceadoFileBase64 записывает каждый фрагмент в текстовый файл; метод TroceadoFileBase64_fin вызывается только в конце, извлекает текст и преобразует его в двоичный формат.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-binary
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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