Todos os produtos
Search
Central de documentação

Drive and Photo Service:Upload de arquivo

Última atualização: Sep 12, 2026

Este tópico descreve as melhores práticas para fazer upload de um arquivo no Drive and Photo Service (PDS). Consulte este conteúdo para enviar arquivos ao PDS.

Termos

  • pasta: arquivo do tipo diretório. Pastas não contêm dados físicos. Para criar uma pasta, chame a operação CreateFile do PDS.

  • arquivo: arquivo que não é do tipo diretório. Arquivos contêm dados físicos. Para criar um arquivo, envie um arquivo local ao PDS. Este tópico explica como realizar esse envio.

Upload de arquivo

Processo

O upload de um arquivo no PDS envolve três etapas:

  1. Chame a operação CreateFile para criar e inicializar o arquivo. O PDS retorna os metadados do arquivo e uma URL para upload via HTTP.

  2. Envie o arquivo usando a URL retornada na etapa anterior.

  3. Chame a operação CompleteFile para concluir o processo de upload.

image

Procedimento

O exemplo a seguir demonstra como enviar um arquivo local ao PDS.

1. Criar um arquivo

Chame a operação Create file para criar e inicializar o arquivo.

Configurações dos parâmetros principais:

  1. drive_id = "testDriveId": ID do drive de destino do arquivo.

  2. parent_file_id = "root": diretório de destino do upload. O valor root indica que o arquivo será enviado ao diretório raiz.

  3. name = "testName.jpg": nome do arquivo a ser enviado.

  4. type = "file": tipo do objeto a ser criado. Valores válidos: file e folder.

  5. size = 13381200: tamanho real do arquivo local, em bytes.

  6. part_info_list = [{"part_number":1},{"part_number":2},{"part_number":3}]: partes do arquivo a serem enviadas. Defina a quantidade de partes com base no tamanho total do arquivo e no tamanho de cada parte configurado no cliente. Especifique várias partes para aumentar a taxa de sucesso e permitir o upload resumível. Neste exemplo, o arquivo tem cerca de 13 MB e cada parte tem 5 MB, resultando em três partes.

Exemplo de corpo da requisição:

{
    "drive_id":"testDriveId",
    "name":"testName.jpg",
    "parent_file_id":"root",
    "part_info_list":[
        {
            "part_number":1
        },
        {
            "part_number":2
        },
        {
            "part_number":3
        }
    ],
    "size":13381200,
    "type":"file"
}

Exemplo de corpo da resposta:

{
    "parent_file_id":"root",
    "part_info_list":[
        {
            "part_number":1,
            "upload_url":"https://xxxx1"
        },
        {
            "part_number":2,
            "upload_url":"https://xxxx2"
        },
        {
            "part_number":3,
            "upload_url":"https://xxxx3"
        }
    ],
    "upload_id":"testUploadId",
    "rapid_upload":false,
    "type":"file",
    "file_id":"testFileId",
    "revision_id":"testRevisionId",
    "domain_id":"testDomainId",
    "drive_id":"testDriveId",
    "file_name":"testName.jpg"
}

Parâmetros principais da resposta:

  1. file_id: ID exclusivo que o PDS atribui ao arquivo. Cada arquivo possui um ID único dentro de um drive.

  2. upload_id: ID que o PDS atribui ao processo de upload. Utilize este identificador nas etapas seguintes, como na conclusão do upload.

  3. part_info_list: URLs de upload que o PDS atribui a cada parte. A quantidade de URLs corresponde exatamente ao número de partes solicitadas, com uma URL por parte.

2. Enviar o arquivo

Percorra a lista e envie as partes do arquivo usando as URLs retornadas na Etapa 1. Este exemplo utiliza o método HTTP PUT.

Código Java de exemplo:

// Traverse all the parts of the file to be uploaded.
for (PartInfo uploadPartInfo : partInfoList) {
   // Calculate the serial numbers of the parts in the local file.
   int number = uploadPartInfo.getPartNumber();
   long pos = (number - 1) * partSize;
   long size = Math.min(length - pos, partSize);
   byte[] partContent = new byte[(int) size];

   // Read the data of the parts from the local file to the memory.
   RandomAccessFile randomAccessFile = new RandomAccessFile(localFile, "r");
   randomAccessFile.seek(pos);
   randomAccessFile.readFully(partContent, 0, (int) size);
   randomAccessFile.close();

   // Upload the parts.
   RequestBody body = RequestBody.create(null, partContent);
   Request request = new Request.Builder()
   .url(uploadPartInfo.getUploadUrl())
   .header("Content-Length", String.valueOf(size))
   .put(body)
   .build();

   OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
   Response response = okHttpClient.newCall(request).execute();

   // Determine whether the parts are uploaded.
   if (!response.isSuccessful()) {
   System.out.println(response.body().string() + "\n");
   Assert.fail("upload part failed, partNumber:" + number);
   return "";
   }
   System.out.println("upload part success, partNumber:" + number);
}

3. Concluir o processo de upload

Após enviar todas as partes, chame a operação CompleteFile para finalizar o upload do arquivo.

Configurações dos parâmetros principais:

  1. drive_id = "testDriveId": ID do drive de destino do arquivo.

  2. file_id = "testFileId": ID do arquivo. Use o valor do parâmetro file_id retornado na Etapa 1.

  3. upload_id = "testUploadId": ID do processo de upload. Use o valor do parâmetro upload_id retornado na Etapa 1.

Exemplo de corpo da requisição:

{
    "drive_id":"testDriveId",
    "file_id":"testFileId",
    "upload_id":"testUploadId"
}

Um código de status HTTP 200 confirma que o upload foi concluído com sucesso.

Exemplo de corpo da resposta:

{
    "domain_id":"testDomainId",
    "drive_id":"testDriveId",
    "file_id":"testFileId",
    "parent_file_id":"root",
    "type":"file",
    "file_extension":"jpg",
    "name":"testName.jpg",
    "size":13381200,
    "status":"available",
    "content_hash":"xxxxx",
    "created_at":"2023-01-16T11:55:12.166Z",
    "updated_at":"2023-01-16T11:55:13.368Z"
}

Upload resumível

Cenários

Durante o upload, você pode pausar temporariamente a transferência. Por exemplo, se desejar enviar arquivos apenas via Wi-Fi, interrompa o processo quando a rede estiver indisponível e retome-o assim que a conexão for restabelecida.

Implementação

O upload de arquivos grandes ocorre mediante a divisão do conteúdo em múltiplas partes.

Considere um arquivo de 50 MB com tamanho de parte definido em 5 MB pelo cliente: o sistema dividirá o arquivo em 10 partes.

image

Suponha que o cliente já tenha enviado as seis primeiras partes ao PDS e pare durante o envio da sétima. Nesse caso, o cliente deve armazenar informações intermediárias do processo, como dados do arquivo e progresso atual. Um banco de dados local é uma opção viável para persistir esses dados.

image

Ao retomar o upload, o sistema descarta quaisquer dados parciais da sétima parte enviados anteriormente. O cliente reinicia o envio a partir da sétima parte incompleta. As URLs das partes restantes podem expirar durante a pausa, gerando o código de erro 403. Se isso ocorrer, chame a operação ListUploadedParts para obter novas URLs de upload para as partes pendentes.

Se a suspensão do upload ultrapassar 10 dias, a retomada não será mais possível. Nessa situação, chame a operação CreateFile para iniciar um novo processo e reenvie o arquivo local desde o início.

Transferência instantânea de arquivo

Visão geral

O PDS oferece deduplicação de arquivos no nível do domínio. Ao tentar enviar um arquivo que já existe no domínio do PDS, não é necessário realizar o upload completo. Basta calcular o hash SHA-1 (Secure Hash Algorithm 1) do arquivo para que o sistema o registre em segundos.

Cenários

Imagine que o Usuário A enviou um filme para um drive no PDS. O Usuário B pode usar a transferência instantânea para enviar o mesmo filme para outro drive no mesmo domínio, sem precisar fazer o upload completo novamente. Isso agiliza o processo e economiza tráfego de rede.

O arquivo registrado pelo Usuário B via transferência instantânea é totalmente independente do arquivo do Usuário A, garantindo a segurança e o isolamento dos dados.

Usar a transferência instantânea de arquivo

Antes de utilizar a transferência instantânea, calcule o hash SHA-1 do arquivo. Ao chamar a operação Create file, defina o parâmetro content_hash com o valor SHA-1 calculado.

Configurações dos parâmetros principais:

  1. content_hash_name = "sha1": algoritmo usado para validação instantânea. Apenas SHA-1 é suportado.

  2. content_hash = "xxxx": valor do hash SHA-1 calculado para o arquivo.

  3. size = 13381200: tamanho total do arquivo.

Os demais parâmetros seguem a mesma configuração descrita na seção "Upload de arquivo" deste tópico.

Exemplo de corpo da requisição:

{
    "drive_id":"testDriveId",
    "name":"testName.jpg",
    "parent_file_id":"root",
    "content_hash":"xxxxx",
    "content_hash_name":"sha1",
    "part_info_list":[
        {
            "part_number":1
        },
        {
            "part_number":2
        },
        {
            "part_number":3
        }
    ],
    "size":13381200,
    "type":"file"
}

Código Java de exemplo para cálculo do hash SHA-1:

public static String getFileHash(File file) throws IOException {
 	 return Hex.encodeHexString((getFileHashBytes(file)));
}

public static byte[] getFileHashBytes(File file) throws IOException {
   byte[] sha1;
   try {
     MessageDigest digest = MessageDigest.getInstance("SHA1");
     byte[] buffer = new byte[10 * 1024];
     FileInputStream is = new FileInputStream(file);
     int len;
     while ((len = is.read(buffer)) != -1) {
        digest.update(buffer, 0, len);
     }
     is.close();
     sha1 = digest.digest();
   } catch (NoSuchAlgorithmException e) {
   	 throw new RuntimeException("SHA1 algorithm not found.");
   }
   return sha1;
}

Exemplo de corpo da resposta:

{
    "domain_id":"testDomainId",
    "drive_id":"testDriveId",
    "parent_file_id":"root",
    "upload_id":"testUploadId",
    "rapid_upload":true,
    "type":"file",
    "file_id":"testFileId",
    "revision_id":"testRevisionId",
    "file_name":"testName.jpg"
}

Parâmetros principais da resposta:

  1. rapid_upload: indica se a transferência instantânea foi aplicada.

O valor true significa que a transferência instantânea ocorreu com sucesso. O PDS identificou um arquivo existente no mesmo domínio com dados idênticos, baseado no hash SHA-1 fornecido. Assim, a resposta não inclui URLs de upload, e o cliente não precisa executar as etapas subsequentes de envio e conclusão.

O valor false indica que a transferência instantânea não foi possível. A resposta conterá as URLs de upload das partes, e o cliente deverá prosseguir com o fluxo normal de upload e finalização.

Usar o recurso de pré-hash para melhorar a precisão

Calcular o hash SHA-1 completo antes do upload pode ser custoso, especialmente para clientes com capacidade computacional limitada ou arquivos muito grandes. Além disso, se não houver correspondência no domínio PDS, todo o esforço de cálculo é desperdiçado, aumentando o tempo total de upload.

Para otimizar esse processo, o PDS oferece o recurso de pré-hash. Em vez de processar o arquivo inteiro, calcule o SHA-1 apenas dos primeiros 1 KB de dados. Ao chamar a operação CreateFile, defina o parâmetro pre_hash com esse valor parcial. O servidor verificará rapidamente se há dados correspondentes no domínio.

Configurações dos parâmetros principais:

  1. pre_hash = "xxxxx": hash SHA-1 dos primeiros 1 KB do arquivo.

Os demais parâmetros seguem a mesma configuração descrita na seção "Upload de arquivo" deste tópico.

Exemplo de corpo da requisição:

{
    "drive_id":"10530",
    "name":"testName.jpg",
    "parent_file_id":"root",
    "part_info_list":[
        {
            "part_number":1
        },
        {
            "part_number":2
        },
        {
            "part_number":3
        }
    ],
    "pre_hash":"xxxx",
    "size":13381200,
    "type":"file"
}

Análise da resposta:

  • Status HTTP 409: existe uma correspondência para os primeiros 1 KB no domínio, sugerindo que o arquivo pode já existir. Nesse caso, o cliente deve calcular o hash SHA-1 completo, chamar a operação Create file novamente e tentar a transferência instantânea. Lembre-se de que o pré-hash não garante correspondência exata, pois diferentes arquivos podem compartilhar os mesmos 1 KB iniciais.

  • Status HTTP 201: não há correspondência para os primeiros 1 KB no domínio, confirmando que o arquivo é inédito. As URLs de upload das partes são retornadas sincronamente, permitindo que o cliente prossiga com o fluxo normal de envio.

O cálculo do pré-hash ocorre de forma assíncrona em segundo plano e pode levar alguns minutos para ser refletido. Se você tentar enviar um arquivo duplicado logo após o upload original, a transferência instantânea pode não estar disponível imediatamente.

Fluxograma

image

Upload de arquivo em modo de sobrescrita

O PDS permite substituir um arquivo existente durante o upload. Para isso, defina o parâmetro file_id com o ID do arquivo alvo ao chamar a operação Create file. Em seguida, siga o fluxo padrão de upload.

Exemplo de corpo da requisição:

{
    "drive_id":"testDriveId",
    "file_id":"testFileId",
    "name":"testName.jpg",
    "parent_file_id":"root",
    "part_info_list":[
        {
            "part_number":1
        },
        {
            "part_number":2
        },
        {
            "part_number":3
        }
    ],
    "size":13373603,
    "type":"file"
}

Pontos importantes:

  1. O ID do arquivo permanece inalterado após a sobrescrita. Continue usando o mesmo identificador para operações futuras.

  2. Em cenários de concorrência onde múltiplos clientes sobrescrevem o mesmo arquivo, prevalece a versão enviada pelo último cliente a chamar a operação CompleteFile.

  3. Para preservar versões anteriores à sobrescrita, ative o recurso de versionamento histórico. Para mais detalhes, consulte ListRevision.

FAQ

O que fazer se as URLs de upload das partes expirarem?

As URLs de upload têm validade de uma hora. Tentativas de envio após esse período retornarão o erro 403. Isso é comum em uploads resumíveis pausados por mais de uma hora. Para resolver, chame a operação ListUploadedParts para obter novas URLs das partes restantes antes de retomar o envio.

Quais limites devo observar ao fazer upload de arquivos?

  • Cada parte do arquivo pode ter no máximo 5 GB.

  • Como o servidor calcula o hash SHA-1 em streaming, as partes devem ser enviadas sequencialmente. Uploads concorrentes de partes do mesmo arquivo não são permitidos.

  • Não é possível sobrescrever partes individuais de um arquivo.

Qual é o prazo de validade de um processo de upload?

Todo processo de upload deve ser concluído em até 10 dias. Caso contrário, o sistema descartará o processo incompleto. Será necessário chamar a operação CreateFile para gerar um novo registro no PDS e reiniciar o upload do arquivo local.