Ansichten:

Verhalten:
Wenn Sie die API zum Hochladen großer Dokumente verwenden, wird die folgende Fehlermeldung angezeigt:

"Exception 413 Request Entity Too Large"

Lösung:
Bitte lesen Sie die folgende Anleitung zum Hochladen großer Dateien mit .NET SDK oder REST API;

.NET SDK
Um große Dokumente hochzuladen, kann die folgende Methode aus den DocuWare-Entwicklerseiten verwendet werden.
Easy Uploading Huge Files | DocuWare SDK Documentation.

REST API
Ein anderer Ansatz muss gewählt werden, wenn große Dokumente über die REST API hochgeladen werden sollen.
Bitte beachten Sie das Beispiel, wie dies erreicht werden kann;

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 = ""; //Benutzername zur Anmeldung
string password = ""; //Passwort
string fileCabinetID = ""; //Dateischrank-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("Organisation", 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)
{
// Definieren Sie die API-Basis- und Archiv-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";

// Festlegen der Chunk-Größe - 10 MB wurde hier willkürlich festgelegt.
int ChunkSize = 10 * 1024 * 1024; // 10 MB

// Setzen Sie den Dateipfad der hochzuladenden Datei
string filePath = $""; //sollte auf Ihren Dateipfad geändert werden|

try
{
//Öffnen Sie den File Stream und ermitteln Sie die Dateigröße, den Dateinamen und das Änderungsdatum.
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
long totalFileSize = fileStream.Length;
string fileName = Path.GetFileName(filePath);
DateTime modificationDate = File.GetLastWriteTimeUtc(filePath);

// Setzen Sie die Endpunkt-URL und erstellen Sie ein neues RestRequest-Objekt mit der POST-Methode
string suffix = $"/FileCabinets/{FileCabinetId}/Documents/";
string url = $"{platformURL}/{suffix}";
var request = new RestRequest(url, Method.Post);

// Initialisieren von Variablen für das Hochladen von Chunks
string chunkReference = null;
int bytesUploaded = 0;

// Schleife durch die Datei und Hochladen von Chunks
while (bytesUploaded < totalFileSize)
{
// Einlesen eines Teils der Datei in einen Puffer
byte[] buffer = new byte[ChunkSize];
int bytesRead = fileStream.Read(buffer, 0, ChunkSize);

// Größe des Puffers ändern, wenn der letzte Chunk kleiner als die Chunk-Größe ist
if (bytesRead < ChunkSize)
{
Array.Resize(ref buffer, bytesRead);
}

// Kopfzeilen für die Anfrage festlegen
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", Dateiname);
request.AddHeader("X-File-Size", totalFileSize.ToString());
request.AddHeader("Cookie", cookie.ToString());
request.AddHeader("Expect", "100-continue");

// Hinzufügen der Chunk-Daten zum Anforderungskörper
request.AddParameter("application/octet-stream", buffer, ParameterType.RequestBody);

// Wenn dies nicht der erste Chunk ist, fügen Sie die Chunk-Referenz und die Standort-Header zur Anfrage hinzu
if (!string.IsNullOrEmpty(chunkReference))
{
request.AddQueryParameter("loc", bytesUploaded.ToString());
request.AddQueryParameter("chunkReference", chunkReference);
}

// Festlegen der Basis-URI und Hinzufügen des Cookies zum Client
Uri baseUri = new Uri(platformURL);
client.CookieContainer.Add(cookie);


// Ausführen der Chunk-Upload-Anforderung
var response = client.Execute(request);
var deserializedJsonResponseBody = JsonConvert.DeserializeObject<IntermediateResponse>(response.Content.ToString());

// Prüfen Sie den Statuscode der Antwort
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine($"Unerwarteter Statuscode: {response.StatusCode}");
Console.WriteLine("Fehler: Upload fehlgeschlagen.");
return;
}

Console.WriteLine("Chunk Request Executed");

/* Wenn weitere Chunks hochgeladen werden sollen, holen Sie die nächste URL aus der Antwort
* und erstelle ein neues RestRequest-Objekt mit der POST-Methode für den nächsten Chunk
*/
if (bytesUploaded + bytesRead < totalFileSize)
{
// Deserialisieren Sie die Antwort JSON, um die nächste URL zu erhalten

url = baseURL + deserializedJsonResponseBody.FileChunk.Links[0].href;
request = new RestRequest(url, Method.Post);
}
else //für den letzten Chunk, die endgültige deserialisierte Antwort
{
var finalResposne = JsonConvert.DeserializeObject<JSON>(response.Content.ToString());
}
// Aktualisieren Sie die insgesamt hochgeladenen Bytes und drucken Sie den Fortschritt
bytesUploaded += bytesRead;

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

Console.WriteLine("Datei erfolgreich hochgeladen.");
}
catch (Exception e)
{
Console.WriteLine(e);
}

}
}

/*Die folgenden Klassen dienen der vollständigen Deserialisierung der JSON-String-Antworten.
* Dabei wird RootObject->FileChunk->Link->href[0] verwendet, das den "nächsten" Link abgreift.
*/
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 gilt sowohl für Cloud- als auch für On-Premise-Organisationen

Bitte beachten Sie: Dieser Artikel ist eine Übersetzung aus dem Englischen. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Original version(en) des Produkts. In der übersetzten Version unserer Artikel können kleinere Fehler enthalten sein, z.B. in der Grammatik. Wir können zwar nicht für die vollständige Richtigkeit der Übersetzung garantieren, aber in den meisten Fällen werden Sie sie als ausreichend informativ empfinden. Im Zweifelsfall wechseln Sie bitte zurück zur englischen Version dieses Artikels.