POST Iniciar Upload Direto de Arquivos
Gera URLs pré-assinadas para o cliente enviar arquivos diretamente ao Cloudflare R2, sem passar pelo backend. Para arquivos até 10 MB, gera uma única URL (PUT simples); para arquivos maiores, inicia uma sessão multipart com uma URL por parte de 10 MB.
Autenticação necessária
Esta rota requer o header Authorization: Bearer {accessToken}
Fluxo completo
- Chame esta rota para obter as URLs de upload.
- Faça o(s)
PUTdiretamente para a(s)uploadUrl(s) retornada(s) — para multipart, uma parte por URL, guardando oETagde cada resposta. - Chame Completar Upload Direto para finalizar e associar os arquivos à consulta.
Limites
Máximo de 15 MB por arquivo e 10 arquivos por requisição. As URLs pré-assinadas expiram em 600 segundos (10 minutos).
Endpoint
POST https://api-dev.imagemais.com.br/api/consultations/direct-upload/initiate
Corpo da Requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
patientId | number | ✅ | ID do paciente |
examType | string | ✅ | Tipo/nome do exame (usado no caminho de armazenamento) |
consultationId | number | ✅ | ID da consulta vinculada |
files | array | ✅ | 1 a 10 arquivos |
files[].fileName | string | ✅ | Nome original do arquivo (extensão deve ser permitida — ver abaixo) |
files[].fileSize | number | ✅ | Tamanho em bytes (máx. 15728640 = 15 MB) |
files[].contentType | string | ✅ | Content-Type do arquivo (ex.: application/pdf) |
Extensões aceitas
jpg, jpeg, png, gif, pdf, doc, docx, xls, xlsx, txt
Requisição
curl -X 'POST' \
'https://api-dev.imagemais.com.br/api/consultations/direct-upload/initiate' \
-H 'accept: application/json' \
-H 'Authorization: Bearer {accessToken}' \
-H 'Content-Type: application/json' \
-d '{
"patientId": 9,
"examType": "Raio-X",
"consultationId": 17,
"files": [
{ "fileName": "exame.pdf", "fileSize": 1000000, "contentType": "application/pdf" }
]
}'
Respostas
201 Criado
Arquivo ≤ 10 MB (mode: "single") — um único PUT para uploadUrl:
{
"files": [
{
"mode": "single",
"originalName": "exame.pdf",
"fileName": "bd7495aa-e483-4c88-8ce8-378671f77f53.pdf",
"key": "consultation/9/17/raio-x/7f8ea8ab9c3767608d05671d0ae2e1c367d34164572bfe159b5bbfe90c518bc8",
"uploadUrl": "https://imagemais-bucket-development.b26dbae339f36de5139f8e8587f7cd7b.r2.cloudflarestorage.com/consultation/9/17/raio-x/7f8ea8ab9c...?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=600&..."
}
]
}
Arquivo > 10 MB (mode: "multipart") — um PUT por parte, cada um retornando um ETag:
{
"files": [
{
"mode": "multipart",
"originalName": "exame-grande.pdf",
"fileName": "29f685f3-c12f-41f3-ab87-ec062e14582f.pdf",
"key": "consultation/9/17/raio-x/7fc828818eed96c3b3c7a94c8118a3e7b95156b5425fddc91e2a854c11631ad8",
"uploadId": "AEI2gpj0SABougXtRKFai2E2lCdp3hfiLrcjmemx5KhFwoY2wpUp...",
"partSize": 10485760,
"parts": [
{
"partNumber": 1,
"url": "https://imagemais-bucket-development.b26dbae339f36de5139f8e8587f7cd7b.r2.cloudflarestorage.com/consultation/9/17/raio-x/...?...&partNumber=1&uploadId=...&x-id=UploadPart"
},
{
"partNumber": 2,
"url": "https://imagemais-bucket-development.b26dbae339f36de5139f8e8587f7cd7b.r2.cloudflarestorage.com/consultation/9/17/raio-x/...?...&partNumber=2&uploadId=...&x-id=UploadPart"
}
]
}
]
}
400 Arquivo excede 15 MB
{
"message": ["files.0.fileSize must not be greater than 15728640"],
"error": "Bad Request",
"statusCode": 400
}
404 Consulta não encontrada
{
"message": "Consulta não encontrada",
"error": "Not Found",
"statusCode": 404
}