Faça o upload de documentos utilizando a API de Impressão Universal do Microsoft Graph

Para imprimir um documento utilizando a API de Impressão Universal no Microsoft Graph, você cria um trabalho de impressão, faz o upload do documento e, em seguida, inicia o trabalho de impressão. Este artigo descreve como fazer o upload de um documento, que começa com a criação de uma sessão de upload .

Para fazer o upload de um arquivo, ou de parte de um arquivo, seu aplicativo faz uma solicitação PUT para o valor uploadUrl recebido na resposta createUploadSession. Você pode fazer o upload de todo o arquivo ou dividi-lo em vários intervalos de bytes, desde que o máximo de bytes em qualquer solicitação seja inferior a 10 MB.

É possível fazer o upload dos segmentos do arquivo em qualquer ordem e o upload pode ser feito em paralelo, com até quatro solicitações simultâneas. Quando todos os segmentos binários de um documento são carregados, o arquivo binário é vinculado a printDocument.

Nota: Se seu aplicativo dividir um arquivo em vários intervalos de bytes, recomendamos que o tamanho de cada intervalo de bytes seja um múltiplo de 200 KB, a menos que você esteja usando o SDK do Microsoft Graph, que exige que o tamanho do segmento seja um múltiplo de 320 KB.

Carregar um arquivo

Solicitação

Faça uma solicitação PUT para o valor uploadUrl recebido na resposta createUploadSession.

Cabeçalhos de solicitação

Nome Descrição
Intervalo do conteúdo bytes {startByteIndex}-{endByteIndex}/{documentSizeInBytes}. Obrigatório.
Comprimento do Conteúdo {contentLength} Obrigatório.

Corpo da solicitação

O corpo da solicitação é um blob binário que contém os bytes do documento que são especificados como um intervalo de bytes inclusivo no cabeçalho Content-Range.

Exemplo

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>

Aqui, 0 e 72796 são os índices inicial e final do segmento de arquivo, e 4533322 é o tamanho do documento.

Resposta

Quando a solicitação for concluída, o servidor responderá com 202 Accepted se houver mais intervalos de bytes que precisem ser carregados.

HTTP/1.1 202 Accepted
Content-Type: application/json

{
  "expirationDateTime": "2020-10-25T02:19:38.1694207Z",
  "nextExpectedRanges": ["72797-4533321"]
}

O aplicativo pode usar o valor de nextExpectedRanges para determinar onde iniciar o próximo intervalo de bytes. Você pode ver vários intervalos especificados, indicando as partes do arquivo que o servidor ainda não recebeu. A propriedade nextExpectedRanges indica intervalos do arquivo que não foram recebidos, e não um padrão para como seu aplicativo deve carregar o arquivo.

HTTP/1.1 202 Accepted
Content-Type: application/json

{
  "expirationDateTime": "2020-10-25T02:19:38.1694207Z",
  "nextExpectedRanges": [
  "72797-72897",
  "78929-4533322"
  ]
}

Comentários

  • Em falhas, quando o cliente envia um fragmento que o servidor já recebeu, o servidor responderá com HTTP 416 Requested Range Not Satisfiable. Você pode solicitar o status do upload para obter uma lista mais detalhada dos intervalos que estão faltando.
  • Incluir o cabeçalho Authorization ao fazer a chamada PUT pode resultar em uma HTTP 401 Unauthorized resposta. O Cabeçalho de Autorização e o token de portador devem ser enviados apenas durante a criação da sessão de upload. Ele não deve ser incluído ao enviar dados para a sessão de upload.

Concluir um upload de arquivo

Quando o último intervalo de bytes de um arquivo for recebido, o servidor responderá com um HTTP 201 Created. O corpo da resposta também incluirá o conjunto de propriedades para o printDocument associado.

Solicitação

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>

Resposta

HTTP/1.1 201 Created
Content-Type: application/json

{
   "id": "9001bcd9-e36a-4f51-bfc6-140c3ad7f9f7",
   "documentName": "TestFile.pdf",
   "contentType": "application/pdf", 
   "size": 4533322
}

Observação: A sessão de upload é excluída após a conclusão do upload do documento.

Obter a sessão de upload

Para obter a sessão de upload, envie uma solicitação GET para a URL de upload.

Solicitação

GET https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}

Resposta

HTTP/1.1 200 OK
Content-Type: application/json

{
  "expirationDateTime": "2020-10-25T02:19:38.1694207Z",
  "nextExpectedRanges": [
  "72797-72897",
  "78929-4533322"
  ]
}

Exemplos de código: Criar sessão de upload e carregar 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 a sessão de upload

Para cancelar uma sessão de upload, envie uma solicitação DELETE para o URL de upload. Isso deve ser usado em cenários em que o upload é abortado; por exemplo, se o usuário cancelar a transferência.

Os arquivos temporários e a sessão de carregamento que os acompanha são automaticamente limpos decorrido o valor de expirationDateTime.

Solicitação

DELETE https://print.print.microsoft.com/uploadSessions/5400be13-5a4e-4c20-be70-90c85bfe5d6e?tempauthtoken={token}

Resposta

HTTP/1.1 204 No Content