Aviso legal: Este tópico pode conter informações sobre produtos de terceiros. As informações servem apenas como referência. A Alibaba Cloud não oferece garantia de qualquer tipo sobre o desempenho e a confiabilidade de produtos de terceiros, nem sobre possíveis impactos de operações nesses produtos.
Visão geral
Este tópico descreve como obter recursos do OSS por meio da segmentação de requisições HTTP Range.
Mensagem
Ao fazer upload ou baixe de um objeto grande (maior que 100 MB) no OSS, a transferência falhará se o ambiente de rede apresentar instabilidades durante o processo. Durante o upload, chame a operação MultipartUpload para realizar o upload multipart. Já no download de um recurso, utilize uma requisição HTTP Range para obter partes específicas de um arquivo grande. Exemplo:
Get /ObjectName HTTP/1.1
Host:xxxx.oss-cn-hangzhou.aliyuncs.com
Date:Tue, 17 Nov 2015 17:27:45 GMT
Authorization:SignatureValue
Range:bytes=[$ByteRange]
Nota: [$ByteRange] indica o intervalo de recursos solicitados. Unidade: bytes. Exemplos:
Range: bytes=0-499 especifique os primeiros 500 bytes.
Range: bytes=500-999 especifique os segundos 500 bytes.
Range: bytes=-500 especifique os últimos 500 bytes.
Range: bytes=500- especifique os dados do byte 500 até o final do objeto.
Range: bytes=0- indica do primeiro ao último byte, ou seja, o conteúdo completo do arquivo.
Especifique apenas um intervalo em uma requisição GetObject. Se você definir vários intervalos, o OSS retornará somente os dados do primeiro. Por exemplo, em Range:bytes=0-499,500-999, o OSS retorna apenas os dados no intervalo de 0 a 499 bytes.
O intervalo válido para [$ByteRange] está entre 0 e content-length - 1.
Se a requisição HTTP Range for válida, a resposta retornará o código 206 e incluirá Content-Range no cabeçalho. Caso a requisição seja inválida ou o intervalo especificado esteja fora dos limites permitidos, o Range não terá efeito. Nesse cenário, a resposta retornará o valor 200 e transmitirá todo o conteúdo do objeto. O exemplo a seguir mostra uma requisição HTTP Range inválida e a descrição do erro.
Nota: Suponha que o tamanho do recurso de um objeto seja de 1.000 bytes e que o intervalo válido seja de 0 a 999. Para evitar que o Range especificado ultrapasse os limites, faça uma requisição HeadObject para obter o tamanho do objeto antes de ler o Range.
Range: byte=0-499: Formato inválido. O valor deve ser bytes.
Range: bytes=0-1000: O valor 1.000 do último byte excede o intervalo válido.
Range: bytes=1000-2000: O intervalo especificado ultrapassa o limite permitido.
Range: bytes=1000-: O primeiro byte excede o intervalo válido.
Range: bytes=-2000: O intervalo especificado ultrapassa o limite permitido.
Execute o comando abaixo para testar a validade do parâmetro Range:
curl -r 0-100 http://xxxx.oss-cn-hangzhou.aliyuncs.com/xx.zip -o /tmp/xx1.zip -v
Comportamento compatível
Ao usar HTTP Range, adicione o cabeçalho de requisição x-oss-range-behavior:standard para alterar o comportamento do OSS quando o intervalo especificado estiver fora dos limites válidos. Veja a seguir exemplos dessas alterações:
Nota: Considere que o tamanho do recurso do objeto seja de 1.000 bytes e o intervalo válido seja 0-999. Ao utilizar uma requisição HTTP Range para obter parte de um arquivo grande com um intervalo inválido, o OSS retorna o código de erro InvalidRange. Para mais detalhes, consulte OSS retorna um erro 416 para resolver o problema. A mensagem de erro detalhada é:
The requested range cannot be satisfied
Range: bytes=500-2000: Se o último byte exceder o intervalo válido, serão retornados os bytes de 500 a 999.
Range: bytes=1000-2000: O erro 416 (InvalidRange) será retornado se o primeiro byte exceder o intervalo válido.
Range: bytes=1000-: O erro 416 (InvalidRange) será retornado se o primeiro byte exceder o intervalo válido.
Range: bytes=-2000: Se o intervalo especificado ultrapassar o limite válido, serão retornados os bytes de 0 a 999, correspondendo ao conteúdo completo do arquivo.
Exemplos
Este tópico apresenta os seguintes exemplos de requisição HTTP Range.
Nota: Suponha que o tamanho do recurso do objeto seja de 1.000 bytes e o intervalo válido seja 0-999.
Requisições normais
-
Conteúdo no intervalo de bytes 0-499 do recurso Object solicitado.
GET /ObjectName Range: bytes=0-499 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:51:30 GMT Authorization: Sigature 206 (Partial Content) content-length: 500 content-range: bytes 0-499/1000 connection: keep-alive etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA928B227D52731327DE078 date: Fri, 18 Oct 2019 02:51:30 GMT [500 bytes of object data] -
Conteúdo do byte 500 do recurso Object solicitado até o final do arquivo.
GET /ObjectName Range: bytes=500- Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:24:39 GMT Authorization: Signature 206 (Partial Content) content-length: 500 content-range: bytes 500-999/1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA9307750EBE33332E3720A date: Fri, 18 Oct 2019 03:24:39 GMT [500 bytes of object data] -
Conteúdo dos últimos 500 bytes do recurso Object solicitado.
GET /ObjectName Range: bytes=-500 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:23:22 GMT Authorization: Signature 206 (Partial Content) content-length: 500 content-range: bytes 500-999/1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA9302A6646AC37397F7039 date: Fri, 18 Oct 2019 03:23:22 GMT [500 bytes of object data]
Exemplo de requisição fora do intervalo
-
Se o valor 1.000 do último byte exceder o intervalo válido, o Range não terá efeito. A resposta retornará o valor 200 e transmitirá todo o conteúdo do objeto.
GET /ObjectName Range: bytes=0-1000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:00:02 GMT Authorization: Signature 200 (OK) content-length: 1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA92AB204321E36347F3E7D date: Fri, 18 Oct 2019 03:00:02 GMT [1000 bytes of object data] -
Quando o intervalo especificado ultrapassa o limite válido, o Range não surte efeito. A resposta retorna o valor 200 e transmite o conteúdo completo do objeto.
GET /ObjectName Range: bytes=1000-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:56:24 GMT Authorization: Sigature 200 (OK) content-length: 1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA929D9CCCC823835CBE134 date: Fri, 18 Oct 2019 02:56:25 GMT [1000 bytes of object data]
Exemplo de requisição com comportamento compatível
-
Adicione o cabeçalho de requisição x-oss-range-behavior:standard. Como o último byte excede o intervalo válido, o sistema retorna o conteúdo no intervalo de 500 a 999 bytes.
GET /ObjectName x-oss-range-behavior: standard Range: bytes=500-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:02:23 GMT Authorization: Signature 206 (Partial Content) content-length: 500 content-range: bytes 500-999/1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA9637FB3B1C73234CC59EB date: Fri, 18 Oct 2019 07:02:23 GMT [500 bytes of object data] -
Inclua o cabeçalho de requisição x-oss-range-behavior:standard. Se o primeiro byte exceder o intervalo válido, um erro 416 será retornado.
GET /ObjectName x-oss-range-behavior: standard Range: bytes=1000-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:04:23 GMT Authorization: Signature 416 (Requested Range Not Satisfiable) content-length: 345 x-oss-request-id: 5DA963F7CEBFAA3931BF91F5 date: Fri, 18 Oct 2019 07:04:23 GMT content-type: application/xml <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>InvalidRange</Code> <Message>The requested range cannot be satisfied</Message> <RequestId>5DA963F7CEBFAA3931BF91F5</RequestId> <HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId> <ActualObjectSize>1000</ActualObjectSize> <RangeRequested>bytes=1000-2000</RangeRequested> </Error> -
Acrescente o cabeçalho de requisição x-oss-range-behavior:standard. Caso o intervalo especificado ultrapasse o limite válido, serão retornados os bytes de 0 a 999, ou seja, o conteúdo completo do arquivo.
GET /ObjectName x-oss-range-behavior: standard Range: bytes=-2000 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 07:06:39 GMT Authorization: Signature 206 (Partial Content) content-length: 1000 content-range: bytes 0-999/1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA9647FC4334F3534AF9A83 date: Fri, 18 Oct 2019 07:06:39 GMT [1000 bytes of object data]
Escopo de aplicação
OSS