Vues :

Comportement :
Lorsque vous utilisez l'API pour télécharger des documents volumineux, le message d'erreur suivant s'affiche :

"Exception 413 Request Entity Too Large"

Solution :
Veuillez consulter le guide suivant pour savoir comment télécharger des fichiers volumineux avec le SDK .NET ou l'API REST ;

.NET SDK
Pour télécharger des documents volumineux, vous pouvez utiliser la méthode suivante, décrite dans les pages du développeur DocuWare.
Easy Uploading Huge Files | DocuWare SDK Documentation.

REST API
Une approche différente est nécessaire pour télécharger des documents volumineux via l'API REST.
Veuillez vous référer à l'exemple qui suit pour savoir comment procéder ;

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 dans X.docuware.cloud
string userName = "" ; //nom d'utilisateur pour se connecter
string password = "" ; //mot de passe
string fileCabinetID = "" ; //identifiant de l'armoire à dossiers
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("Organization", orgName) ;
request.AddParameter("UserName", nom d'utilisateur) ;
request.AddParameter("Password", mot de passe) ;
request.AddParameter("RememberMe", "true") ;

RestResponse response = client.Execute(request) ;
//Capture cookie for use in next call
Cookie cookie = response.Cookies[1] ;

Console.WriteLine("Finished") ;
// Configuration du découpage en morceaux
chunkUpload(cookie, client) ;
}

public static void chunkUpload(Cookie cookie, RestClient restClient)
{
// Définir la base API et les URL des armoires de fichiers
RestClient client = restClient ;
string OrgName = "" ; // X dans X.docuware.cloud
string baseURL = $ "https://{OrgName}.docuware.cloud" ;
string platformURL = $ "{baseURL}/DocuWare/Platform" ;
string FileCabinetId = "98f77e6e-5a56-406e-a6d4-51ef7a37eda1" ;

// Définir la taille du bloc - 10 Mo a été fixé arbitrairement ici.
int ChunkSize = 10 * 1024 * 1024 ; // 10 Mo

// Définir le chemin d'accès du fichier à télécharger
string filePath = $"" ; //doit être remplacé par votre chemin d'accès|

try
{
//Ouvrir le File Stream et obtenir la taille du fichier, le nom du fichier et la date de modification.
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read) ;
long totalFileSize = fileStream.Length ;
string fileName = Path.GetFileName(filePath) ;
DateTime modificationDate = File.GetLastWriteTimeUtc(filePath) ;

// Définir l'URL du point final et créer un nouvel objet RestRequest avec la méthode POST
string suffix = $"/FileCabinets/{FileCabinetId}/Documents/" ;
string url = $"{platformURL}/{suffix}" ;
var request = new RestRequest(url, Method.Post) ;

// Initialisation des variables pour le téléchargement de morceaux
string chunkReference = null ;
int bytesUploaded = 0 ;

// Boucle à travers le fichier et télécharge les morceaux
while (bytesUploaded < totalFileSize)
{
// Lecture d'un morceau du fichier dans un tampon
byte[] buffer = new byte[ChunkSize] ;
int bytesRead = fileStream.Read(buffer, 0, ChunkSize) ;

// Redimensionne le tampon si le dernier morceau est inférieur à la taille du morceau
if (bytesRead < ChunkSize)
{
Array.Resize(ref buffer, bytesRead) ;
}

// Définir les en-têtes de la requête
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") ;

// Ajouter les données du chunk au corps de la requête
request.AddParameter("application/octet-stream", buffer, ParameterType.RequestBody) ;

// S'il ne s'agit pas du premier bloc, ajoutez la référence du bloc et les en-têtes de localisation à la requête
if ( !string.IsNullOrEmpty(chunkReference))
{
request.AddQueryParameter("loc", bytesUploaded.ToString()) ;
request.AddQueryParameter("chunkReference", chunkReference) ;
}

// Définir l'URL de base et ajouter le cookie au client
Uri baseUri = new Uri(platformURL) ;
client.CookieContainer.Add(cookie) ;


// Exécution de la demande de téléchargement du chunk
var response = client.Execute(request) ;
var deserializedJsonResponseBody = JsonConvert.DeserializeObject<IntermediateResponse>(response.Content.ToString()) ;

// Vérifier le code d'état de la réponse
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine($"Unxpected status code : {response.StatusCode}") ;
Console.WriteLine("Error : Upload failed.") ;
return ;
}

Console.WriteLine("Chunk Request Executed") ;

/* S'il y a d'autres morceaux à télécharger, récupérez l'URL suivante dans la réponse
* et créez un nouvel objet RestRequest avec la méthode POST pour le morceau suivant
*/
if (bytesUploaded + bytesRead < totalFileSize)
{
// Désérialise la réponse JSON pour obtenir l'URL suivante

url = baseURL + deserializedJsonResponseBody.FileChunk.Links[0].href ;
request = new RestRequest(url, Method.Post) ;
}
else //pour le dernier morceau, obtenir la réponse finale désérialisée
{
var finalResposne = JsonConvert.DeserializeObject<JSON>(response.Content.ToString()) ;
}
// Mise à jour du nombre total d'octets téléchargés et impression de la progression
bytesUploaded += bytesRead ;

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

Console.WriteLine("Fichier téléchargé avec succès.") ;
}
catch (Exception e)
{
Console.WriteLine(e) ;
}

}
}

/*Les classes ci-dessous sont destinées à la désérialisation complète des réponses JSON.
* Ce qui est utilisé ici est RootObject->FileChunk->Link->href[0], qui récupère le lien "suivant".
*/
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 Link
{
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 Section
{
public List<string> SignatureStatus { get ; set ; }
public Pages Pages { get ; set ; }
public Thumbnails Thumbnails { get ; set ; }
public List<Link> Links { 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 Pages
{
public List<object> Page { get ; set ; }
}

public class Thumbnails
{
public List<object> Page { 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 Field
{
public bool SystemField { 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 Flags
{
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 applicable aux organisations en nuage et sur site

Veuillez noter : Cet article est une traduction de l'anglais. Les informations contenues dans cet article sont basées sur la ou les versions originales des produits en langue anglaise. Il peut y avoir des erreurs mineures, notamment dans la grammaire utilisée dans la version traduite de nos articles. Bien que nous ne puissions pas garantir l'exactitude complète de la traduction, dans la plupart des cas, vous la trouverez suffisamment informative. En cas de doute, veuillez revenir à la version anglaise de cet article.