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 in X.docuware.cloud
string userName = ""; //username to login with
string password = ""; //password
string fileCabinetID = ""; //file cabinet ID
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", userName);
request.AddParameter("Password", password);
request.AddParameter("RememberMe", "true");
RestResponse response = client.Execute(request);
//Capture cookie for use in next call
Cookie cookie = response.Cookies[1];
Console.WriteLine("Finished");
// Chunking Setup
chunkUpload(cookie, client);
}
public static void chunkUpload(Cookie cookie, RestClient restClient)
{
// Define the API base and file cabinet URLs
RestClient client = restClient;
string OrgName = ""; // X in X.docuware.cloud
string baseURL = $"https://{OrgName}.docuware.cloud";
string platformURL = $"{baseURL}/DocuWare/Platform";
string FileCabinetId = "98f77e6e-5a56-406e-a6d4-51ef7a37eda1";
// Set the Chunk Size - 10 MB was arbitrarily set here.
int ChunkSize = 10 * 1024 * 1024; // 10 MB
// Set the file path of the file to be uploaded
string filePath = $""; //should be changed to your filepath|
try
{
//Open the File Stream and get the file size, filename, and modification date.
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
long totalFileSize = fileStream.Length;
string fileName = Path.GetFileName(filePath);
DateTime modificationDate = File.GetLastWriteTimeUtc(filePath);
// Set the endpoint URL and create a new RestRequest object with the POST method
string suffix = $"/FileCabinets/{FileCabinetId}/Documents/";
string url = $"{platformURL}/{suffix}";
var request = new RestRequest(url, Method.Post);
// Initialize variables for chunk uploading
string chunkReference = null;
int bytesUploaded = 0;
// Loop through the file and upload chunks
while (bytesUploaded < totalFileSize)
{
// Read a chunk of the file into a buffer
byte[] buffer = new byte[ChunkSize];
int bytesRead = fileStream.Read(buffer, 0, ChunkSize);
// Resize the buffer if the last chunk is less than the chunk size
if (bytesRead < ChunkSize)
{
Array.Resize(ref buffer, bytesRead);
}
// Set headers for the request
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");
// Add the chunk data to the request body
request.AddParameter("application/octet-stream", buffer, ParameterType.RequestBody);
// If this is not the first chunk, add the chunk reference and location headers to the request
if (!string.IsNullOrEmpty(chunkReference))
{
request.AddQueryParameter("loc", bytesUploaded.ToString());
request.AddQueryParameter("chunkReference", chunkReference);
}
// Set the base URL and add the cookie to the client
Uri baseUri = new Uri(platformURL);
client.CookieContainer.Add(cookie);
// Execute the chunk upload request
var response = client.Execute(request);
var deserializedJsonResponseBody = JsonConvert.DeserializeObject<IntermediateResponse>(response.Content.ToString());
// Check the response status code
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine($"Unexpected status code: {response.StatusCode}");
Console.WriteLine("Error: Upload failed.");
return;
}
Console.WriteLine("Chunk Request Executed");
/* If there are more chunks to be uploaded, get the next URL from the response
* and create a new RestRequest object with the POST method for the next chunk
*/
if (bytesUploaded + bytesRead < totalFileSize)
{
// Deserialize the response JSON to get the next URL
url = baseURL + deserializedJsonResponseBody.FileChunk.Links[0].href;
request = new RestRequest(url, Method.Post);
}
else //for the last chunk, get the final deserialized response
{
var finalResposne = JsonConvert.DeserializeObject<JSON>(response.Content.ToString());
}
// Update the total bytes uploaded and print progress
bytesUploaded += bytesRead;
Console.WriteLine($"Uploaded {bytesUploaded} / {totalFileSize} bytes");
}
Console.WriteLine("File uploaded successfully.");
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
/*The below classes are for full deserialization of the JSON string responses.
* What are used in this is RootObject->FileChunk->Link->href[0], which grabs the "next" link.
*/
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; }
}
}
REMARQUE : La commande doit être utilisée exactement comme elle est écrite
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.
