El código de cliente que finalmente ha funcionado es el siguiente.
async function exportarCanvasF1(nombrearchivo, start_) {
let start = Number(start_);
var chunkSize = 30000; // 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_ = encodeURIComponent(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_ = encodeURIComponent(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.");
}
});
}
}
Y el de cliente:
public string TroceadoFileBase64(string base64file, string nombrefile, string start)
{
string jsonDevolucion = "";
**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();
}