Vistas:

Comportamiento:
Al utilizar la API para cargar documentos de gran tamaño, se muestra el siguiente mensaje de error;

"Exception 413 Request Entity Too Large"

Solución:
Consulte la siguiente guía sobre cómo cargar archivos de gran tamaño con .NET SDK o REST API;

.NET SDK
Para cargar documentos de gran tamaño, se puede utilizar el siguiente método de las páginas para desarrolladores de DocuWare para cargar en trozos.
Easy Uploading Huge Files | DocuWare SDK Documentation.

REST API
Será necesario adoptar un enfoque diferente al cargar documentos de gran tamaño a través de REST API.
Consulte el ejemplo de cómo hacerlo;

using System.Net;
using RestSharp;
using System.IO;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;

public static class ChunkUpload {

public static void RestSharpCallSequence()
{
string orgName = ""; // X en X.docuware.cloud
string userName = ""; //nombre de usuario para iniciar sesión con
string password = ""; //contraseña
string fileCabinetID = ""; //identificador del archivador
string BaseUrl = "https://ORGNAME.docuware.com/DocuWare/Platform";
RestClient client = new RestClient(BaseUrl);

RestRequest request = new RestRequest($"{baseURL}/Account/Logon", Method.Post);

request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Accept", "application/json");

request.AddParameter("Organización", orgName);
request.AddParameter("UserName", userName);
request.AddParameter("Password", password);
request.AddParameter("RememberMe", "true");

RestResponse response = client.Execute(request);
//Capturar cookie para utilizarla en la siguiente llamada
Cookie cookie = response.Cookies[1];

Console.WriteLine("Finished");
// Chunking Setup
chunkUpload(cookie, client);
}

public static void chunkUpload(Cookie, RestClient restClient)
{
// Definir la base API y las URL del archivador
RestClient client = restClient;
string OrgName = ""; // X en X.docuware.cloud
string baseURL = $"https://{OrgName}.docuware.cloud";
string platformURL = $"{baseURL}/DocuWare/Platform";
string FileCabinetId = "98f77e6e-5a56-406e-a6d4-51ef7a37eda1";

// Establecer el tamaño del trozo - 10 MB se estableció arbitrariamente aquí.
int ChunkSize = 10 * 1024 * 1024; // 10 MB

// Establecer la ruta del archivo que se va a cargar
string filePath = $""; //debe cambiarse a su ruta de archivo|

try
{
//Abre el FileStream y obtén el tamaño del archivo, el nombre del archivo y la fecha de modificación.
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
long totalFileSize = fileStream.Length;
string fileName = Path.GetFileName(filePath);
DateTime modificationDate = File.GetLastWriteTimeUtc(filePath);

// Establecer la URL del endpoint y crear un nuevo objeto RestRequest con el método POST
string suffix = $"/FileCabinets/{FileCabinetId}/Documents/";
string url = $"{platformURL}/{suffix}";
var request = new RestRequest(url, Method.Post);

// Inicializar variables para la carga de chunk
string chunkReference = null;
int bytesUploaded = 0;

// Recorre el archivo y sube los trozos
while (bytesUploaded < totalFileSize)
{
// Leer un trozo del archivo en un buffer
byte[] buffer = new byte[ChunkSize];
int bytesRead = fileStream.Read(buffer, 0, ChunkSize);

// Redimensiona el buffer si el último chunk es menor que el tamaño del chunk
if (bytesRead < ChunkSize)
{
Array.Resize(ref buffer, bytesRead);
}

// Establece las cabeceras de la petición
request.AddHeader("Content-Type", "application/octet-stream");
request.AddHeader("Content-Length", bytesRead.ToString());
request.AddHeader("Content-Disposition", $"inline; filename="{fileName}\"; modificationdate="{modificationDate:R}\");
request.AddHeader("X-File-ModifiedDate", $"{modificationDate:R}");
request.AddHeader("X-File-Name", fileName);
request.AddHeader("X-File-Size", totalFileSize.ToString());
request.AddHeader("Cookie", cookie.ToString());
request.AddHeader("Expect", "100-continue");

// Añadir los datos del chunk al cuerpo de la petición
request.AddParameter("application/octet-stream", buffer, ParameterType.RequestBody);

¡// Si no es el primer trozo, añade la referencia del trozo y las cabeceras de ubicación a la petición
if (!string.IsNullOrEmpty(chunkReference))
{
request.AddQueryParameter("loc", bytesUploaded.ToString());
request.AddQueryParameter("chunkReference", chunkReference);
}

// Establecer la URL base y añadir la cookie al cliente
Uri baseUri = new Uri(platformURL);
client.CookieContainer.Add(cookie);


// Ejecutar la solicitud de carga de trozos
var response = client.Execute(request);
var deserializedJsonResponseBody = JsonConvert.DeserializeObject<IntermediateResponse>(response.Content.ToString());

// Comprueba el código de estado de la respuesta
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine($"Código de estado inesperado: {response.StatusCode}");
Console.WriteLine("Error: Carga fallida.");
return;
}

Console.WriteLine("Chunk Request Executed");

/* Si hay más chunks que subir, obtén la siguiente URL de la respuesta
* y crea un nuevo objeto RestRequest con el método POST para el siguiente chunk
*/
if (bytesUploaded + bytesRead < totalFileSize)
{
// Deserializa el JSON de la respuesta para obtener la siguiente URL

url = baseURL + deserializedJsonResponseBody.FileChunk.Links[0].href;
request = new RestRequest(url, Method.Post);
}
else //para el último trozo, obtener la respuesta final deserializada
{
var finalResposne = JsonConvert.DeserializeObject<JSON>(response.Content.ToString());
}
// Actualiza el total de bytes subidos e imprime el progreso
bytesUploaded += bytesRead;

Console.WriteLine($"Cargado {bytesUploaded} / {totalFileSize} bytes");
}

Console.WriteLine("Archivo cargado correctamente.");
}
catch (Exception e)
{
Console.WriteLine(e);
}

}
}

/*Las siguientes clases son para la deserialización completa de las respuestas de cadena JSON.
* Lo que se utiliza en esto es RootObject->FileChunk->Link->href[0], que coge el enlace "siguiente".
*/
public class FileChunk
{
public List<Link> Links { get; set; }
public bool Finished { get; set; }
public string LastChunkId { get; set; }
public int BytesWritten { get; set; }
}

public class Enlace
{
public string rel { get; set; }
public string href { get; set; }
}

public class IntermediateResponse
{
public FileChunk FileChunk { get; set; }
public bool HaveMoreTotalPages { get; set; }
public bool HasTextAnnotation { get; set; }
public bool HasXmlDigitalSignatures { get; set; }
public bool AnnotationsPreview { get; set; }
public int TotalPages { get; set; }
public int Id { get; set; }
public bool LastModifiedSpecified { get; set; }
public bool CreatedAtSpecified { get; set; }
public int FileSize { get; set; }
public int SectionCount { get; set; }
public string IntellixTrust { get; set; }
public string VersionStatus { get; set; }
}

public class Sección
{
public List<string> SignatureStatus { get; set; }
public Páginas Páginas { get; set; }
public Miniaturas Miniaturas { get; set; }
public List<Link> Enlaces { get; set; }
public string Id { get; set; }
public string ContentType { get; set; }
public bool HaveMorePages { get; set; }
public int PageCount { get; set; }
public int FileSize { get; set; }
public string OriginalFileName { get; set; }
public string ContentModified { get; set; }
public bool HasTextAnnotation { get; set; }
public bool AnnotationsPreview { get; set; }
}

public class Páginas
{
public List<object> Página { get; set; }
}

public class Miniaturas
{
public List<object> Página { get; set; }
}

public class JSON
{
public Guid FileCabinetId { get; set; }
public List<Field> Fields { get; set; }
public Flags Flags { get; set; }
public Version Version { get; set; }
public List<Link> Links { get; set; }
public List<Section> Sections { get; set; }
public string ContentType { get; set; }
public FileChunk FileChunk { get; set; }
public bool HaveMoreTotalPages { get; set; }
public bool HasTextAnnotation { get; set; }
public bool HasXmlDigitalSignatures { get; set; }
public bool AnnotationsPreview { get; set; }
public int TotalPages { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string LastModified { get; set; }
public bool LastModifiedSpecified { get; set; }
public string CreatedAt { get; set; }
public bool CreatedAtSpecified { get; set; }
public int FileSize { get; set; }
public int SectionCount { get; set; }
public string IntellixTrust { get; set; }
public string VersionStatus { get; set; }
}

public class Campo
{
public bool CampoSistema { get; set; }
public string FieldName { get; set; }
public string FieldLabel { get; set; }
public bool IsNull { get; set; }
public bool ReadOnly { get; set; }
public object Item { get; set; }
public string ItemElementName { get; set; }
}

public class Banderas
{
public bool IsCold { get; set; }
public bool IsDBRecord { get; set; }
public bool IsCheckedOut { get; set; }
public bool IsCopyRightProtected { get; set; }
public bool IsVoiceAvailable { get; set; }
public bool HasAppendedDocuments { get; set; }
public bool IsProtected { get; set; }
public bool IsDeleted { get; set; }
public bool IsEmail { get; set; }
}
}

KBA aplicable tanto a organizaciones en la nube como locales

Tenga en cuenta: Este artículo es una traducción del idioma inglés. La información contenida en este artículo se basa en la(s) versión(es) original(es) del producto(s) en inglés. Puede haber errores menores, como en la gramática utilizada en la versión traducida de nuestros artículos. Si bien no podemos garantizar la exactitud completa de la traducción, en la mayoría de los casos, encontrará que es lo suficientemente informativa. En caso de duda, vuelva a la versión en inglés de este artículo.