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 = ""; //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; }
}
}
HINWEIS: Der Befehl muss genau so verwendet werden, wie er geschrieben ist
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.
