Cargar documentos mediante la API de Impresión universal de Microsoft Graph
Para imprimir un documento con la API de impresión universal de Microsoft Graph, cree un trabajo de impresión, cargue un documento y luego inicie el trabajo de impresión. Este artículo describe cómo cargar un documento, lo que comienza con crear una sesión de carga.
Para cargar un archivo o una parte de un archivo, la aplicación hace una solicitud PUT al valor uploadUrl recibido en la respuesta createUploadSession. Puede cargar el archivo completo o dividir el archivo en varios intervalos de bytes, siempre y cuando el número máximo de bytes de cualquier solicitud dada sea inferior a 10 MB.
Los segmentos del archivo pueden cargarse en cualquier orden y se pueden cargar en paralelo, con hasta cuatro solicitudes simultáneas. Cuando se cargan todos los segmentos binarios de un documento, el archivo binario está vinculado al printDocument.
Nota: Si la aplicación divide un archivo en varios intervalos de bytes, se recomienda que el tamaño de cada intervalo de bytes sea un múltiplo de 200 KB a menos que se use el SDK de Microsoft Graph, lo que requiere que el tamaño del segmento sea un múltiplo de 320 KB.
Cargar un archivo
Solicitud
Realice una solicitud PUT al valor uploadUrl recibido en la respuesta createUploadSession.
Encabezados de solicitud
Nombre | Descripción |
---|---|
Content-Range | bytes {startByteIndex}-{endByteIndex}/{documentSizeInBytes}. Necesario. |
Content-Length | {contentLength} Necesario. |
Cuerpo de solicitud
El cuerpo de la solicitud es un blob binario que contiene los bytes del documento que se especifican como un rango de bytes inclusivo en el encabezado Content-Range
.
Ejemplo
PUT https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}
Content-Range: bytes=0-72796/4533322
Content-Length: 72797
<bytes 0-72796 of the file>
Aquí, 0 y 72 796 son los índices de inicio y finalización del segmento de archivos y 4 533 322 es el tamaño del documento.
Respuesta
Cuando se complete la solicitud, el servidor responderá con 202 Accepted
si existen más intervalos de bytes que necesitan cargarse.
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"expirationDateTime": "2020-10-25T02:19:38.1694207Z",
"nextExpectedRanges": ["72797-4533321"]
}
Su aplicación puede usar el valor nextExpectedRanges para determinar dónde comenzar el siguiente intervalo de bytes. Es posible que vea varios intervalos especificados, lo que indica las partes del archivo que aún no ha recibido el servidor. La propiedad nextExpectedRanges indica intervalos del archivo que no se han recibido y no un patrón de cómo debe cargar el archivo la aplicación.
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"expirationDateTime": "2020-10-25T02:19:38.1694207Z",
"nextExpectedRanges": [
"72797-72897",
"78929-4533322"
]
}
Comentarios
- Cuando se produzcan errores en los que el cliente envíe un fragmento que el servidor ya ha recibido, el servidor responderá
HTTP 416 Requested Range Not Satisfiable
. Puede solicitar el estado de la carga para obtener una lista más detallada de los intervalos que faltan. - Incluir el encabezado
Authorization
al hacer la llamadaPUT
puede resultar en una respuestaHTTP 401 Unauthorized
. El token de portador y el encabezado de autorización solo se deben enviar al crear la sesión de carga. No se debe incluir al cargar datos en la sesión de carga. - Se recomienda registrar los
X-MSEdge-Ref
encabezados yrequest-id
de respuesta, si están presentes, para ayudar en las investigaciones del equipo de soporte técnico.
Completar una carga de archivos
Cuando se reciba el último intervalo de bytes de un archivo, el servidor responderá con un HTTP 201 Created
. El cuerpo de la respuesta también incluirá el conjunto de propiedades del printDocument asociado.
Solicitud
PUT https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}
Content-Length: 10
Content-Range: bytes 4533312-4533321/4533322
<final bytes of the file>
Respuesta
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "9001bcd9-e36a-4f51-bfc6-140c3ad7f9f7",
"documentName": "TestFile.pdf",
"contentType": "application/pdf",
"size": 4533322
}
Nota: La sesión de carga se elimina una vez que se complete la carga del documento.
Obtener la sesión de carga
Para obtener la sesión de carga, envíe una solicitud GET a la dirección URL de carga.
Solicitud
GET https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}
Respuesta
HTTP/1.1 200 OK
Content-Type: application/json
{
"expirationDateTime": "2020-10-25T02:19:38.1694207Z",
"nextExpectedRanges": [
"72797-72897",
"78929-4533322"
]
}
Ejemplos de código: crear una sesión de carga y cargar documentos
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
var properties = new PrintDocumentUploadProperties
{
DocumentName = "TestFile.pdf",
ContentType = "application/pdf",
Size = 4533322
};
var uploadSession = await graphClient.Print.Printers["{printer-id}"].Jobs["{printJob-id}"].Documents["{printDocument-id}"]
.CreateUploadSession(properties)
.Request()
.PostAsync()
// if using Graph SDK, maxSliceSize should in multiples of 320 KiB
int maxSliceSize = 320 * 1024;
var fileUploadTask =
new LargeFileUploadTask<PrintDocument>(uploadSession, fileStream, maxSliceSize);
// Create a callback that is invoked after each slice is uploaded
IProgress<long> progress = new Progress<long>(prog =>
{
Console.WriteLine($"Uploaded {prog} bytes of {fileStream.Length} bytes");
});
// Upload the file
var uploadResult = await fileUploadTask.UploadAsync(progress);
Cancelar la sesión de carga
Para cancelar una sesión de carga, envíe una solicitud DELETE a la dirección URL de carga. Esto debe usarse en escenarios en los que se anule la carga; por ejemplo, si el usuario cancela la transferencia.
Los archivos temporales y la sesión de carga que los acompaña se limpian automáticamente cuando pasa la expirationDateTime.
Solicitud
DELETE https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}
Respuesta
HTTP/1.1 204 No Content