En esta página, se trata la conversión de archivos hacia y desde el estado comprimido en gzip. En esta página, se incluyen una descripción general de transcodificación, recomendaciones para trabajar con metadatos asociados y el comportamiento de archivos comprimidos en Cloud Storage.
Transcodificación y gzip
gzip es una forma de compresión de datos: reduce el tamaño de un archivo de forma típica. Esto permite que el archivo se pueda transferir más rápido y se pueda almacenar con menos uso de espacio que si no estuviera comprimido. Comprimir un archivo puede reducir costos y el tiempo de transferencia. La transcodificación, en Cloud Storage, es el cambio automático de la compresión de un archivo antes de que se entregue a un solicitante. Cuando la transcodificación da como resultado un archivo comprimido en gzip, se puede considerar compresiva, mientras que si el resultado es un archivo que ya no está comprimido en gzip, se la puede considerar descompresiva. Cloud Storage es compatible con la forma descompresiva de la transcodificación.
Cloud Storage no es compatible con la transcodificación descompresiva para objetos comprimidos por Brotli.
Transcodificación descompresiva
La transcodificación descompresiva te permite almacenar versiones comprimidas de archivos en Cloud Storage, lo que reduce los costos de almacenamiento en reposo, sin dejar de entregar el archivo al solicitante, sin compresión. Esto es útil, por ejemplo, cuando se entregan archivos a los clientes.
Para que se produzca una transcodificación descompresiva, un objeto debe cumplir con dos criterios:
El archivo está comprimido en gzip cuando se almacena en Cloud Storage.
Los metadatos del objeto incluyen
Content-Encoding: gzip
.
Cuando un objeto cumple con estos dos criterios, se somete a una transcodificación descompresiva cuando se entrega y la respuesta que contiene el objeto no contendrá un encabezado Content-Encoding
o Content-Length
.
Hay dos maneras de evitar que la transcodificación descompresiva se produzca en un objeto que de otra forma se considera apto:
Si la solicitud del objeto incluye un encabezado
Accept-Encoding: gzip
, el objeto se entrega como aparece en esa solicitud específica, junto con un encabezado de respuestaContent-Encoding: gzip
.Si el campo de metadatos
Cache-Control
del objeto está establecido enno-transform
, se entrega como un objeto comprimido en todas las solicitudes posteriores, sin importar si hay encabezados de solicitudAccept-Encoding
.
Evitar la transcodificación descompresiva es útil, por ejemplo, si deseas reducir el costo o el tiempo de transferencia de datos salientes, o si deseas validar los objetos descargados con las sumas de comprobación crc32c/md5 esperadas.
Consideraciones
Ten en cuenta lo siguiente cuando trabajes con transcodificación descompresiva:
La transcodificación descompresiva invalida la verificación de integridad. Si los solicitantes de tus datos dependen de la suma de comprobación para la verificación de integridad, no debes usar la transcodificación descompresiva.
La transcodificación descompresiva te permite almacenar objetos en Cloud Storage en estado comprimido, lo que ahorra espacio y costos. Sin embargo, los cargos por descargar el objeto se basan en su tamaño descomprimido, porque ese es el tamaño del objeto entregado.
Cuando se accede desde un bucket activado por Cloud Storage FUSE, los objetos no se someten a una transcodificación descompresiva y se leen como comprimidos.
Tipo del contenido en comparación a la codificación del contenido
Hay varios comportamientos que debes tener en cuenta acerca de la relación de Content-Type
y Content-Encoding
con la transcodificación. Ambos son metadatos almacenados junto con un objeto. Consulta Visualiza y edita los metadatos de objetos a fin de obtener instrucciones detalladas para agregar metadatos a objetos.
Content-Type
indica el tipo de objeto que se sube y debe incluirse en todas las cargas. Por ejemplo:
Content-Type: text/plain
indica que el objeto subido es un archivo de texto sin formato. Aunque no hay ninguna verificación para garantizar que el Content-Type
especificado coincida con la verdadera naturaleza de un objeto subido, la especificación incorrecta de su tipo en el mejor de los casos hará que los solicitantes reciban algo diferente de lo que esperaban y podría conducir a comportamientos no deseados.
Content-Encoding
es opcional y, si lo deseas, puede incluirse en la carga de archivos comprimidos. Por ejemplo:
Content-Encoding: gzip
indica que el objeto subido está comprimido en gzip. Al igual que con Content-Type
, no hay ninguna verificación para garantizar que el Content-Encoding
especificado se aplique en realidad al objeto subido, y la especificación incorrecta de la codificación de un objeto podría conducir a un comportamiento no deseado en las solicitudes de descarga posteriores.
Recomendaciones
Cuando se sube un objeto comprimido en gzip, la forma recomendada de configurar tus metadatos es especificar
Content-Type
yContent-Encoding
. Por ejemplo, para un archivo de texto sin formato comprimido, esta sería la forma recomendada:Content-Type: text/plain Content-Encoding: gzip
Esto brinda la mayor cantidad de información sobre el estado del objeto a cualquiera que acceda a él. Esto también hace que el objeto sea elegible para la transcodificación descompresiva cuando se descargue más tarde, lo que permite que las aplicaciones cliente manejen la semántica de
Content-Type
de forma correcta.Como alternativa, puedes subir el objeto con
Content-Type
establecido para indicar compresión y sin NINGÚNContent-Encoding
. Por ejemplo:Content-Type: application/gzip
De todas formas, en este caso lo único que se sabe de inmediato sobre el objeto es que está comprimido en gzip, sin información sobre el tipo de objeto subyacente. Además, el objeto no es elegible para la transcodificación descompresiva.
Prácticas no recomendadas
A pesar de que es posible hacerlo, no se debe subir un archivo comprimido en gzip sin indicar la naturaleza comprimida del archivo. Por ejemplo, para un archivo de texto sin formato comprimido en gzip, debes evitar configurar solo
Content-Type: text/plain
. Hacer eso tergiversa el estado del objeto que se entregará a un solicitante.Del mismo modo, los objetos no deben subirse con un
Content-Type
omitido, incluso si se incluye unContent-Encoding
. Si lo haces, es posible queContent-Type
se establezca en un valor predeterminado, pero que se rechace la solicitud, según cómo se realice la carga.
Prácticas incorrectas
No debes configurar tus metadatos para que informen de forma redundante la compresión del objeto:
Content-Type: application/gzip Content-Encoding: gzip
Esto implica que lo que subes es un objeto comprimido en gzip que se volvió a comprimir en gzip una segunda vez, aunque ese no es el caso típico (si en realidad quieres comprimir un archivo dos veces, consulta la sección sobre el uso de gzip en objetos comprimidos a continuación). Cuando la transcodificación descompresiva se realiza sobre un objeto informado de forma incorrecta, este se entrega con la identidad codificada, pero los solicitantes creerán que recibieron un objeto que aún tiene una capa de compresión asociada. Los intentos de descomprimir el objeto fallarán.
Del mismo modo, un archivo que no esté comprimido en gzip no debe subirse con
Content-Encoding: gzip
. Si haces eso, el objeto parecerá elegible para la transcodificación, pero, cuando se lo solicite, los intentos de transcodificación fallarán.
Usa gzip en objetos comprimidos
Algunos objetos, como muchos archivos de imagen, video y audio, sin mencionar a los archivos gzip en sí, ya se encuentran comprimidos. Usar gzip en esos objetos ofrece casi ningún beneficio: en la mayoría de los casos, hacerlo agranda el objeto debido a la sobrecarga de gzip. Por este motivo, no se suele recomendar que uses gzip en contenido comprimido, ya que, además, podría causar comportamientos no deseados.
Por ejemplo, aunque Cloud Storage permite que se suban y almacenen objetos “con doble compresión” (es decir, objetos que están comprimidos en gzip, pero también tienen un tipo de contenido subyacente Content-Type
comprimido), no permite que se entreguen objetos en un estado con doble compresión, a menos que sus metadatos Cache-Control
incluyan no-transform
. En su lugar, quita el nivel de compresión externo, gzip, descarta el encabezado de respuesta Content-Encoding
y entrega el objeto resultante. Esto ocurre incluso para solicitudes con Accept-Encoding: gzip
.
Por lo tanto, el archivo que recibe el cliente no tiene la misma suma de verificación que lo que se subió y almacenó en Cloud Storage, por lo que cualquier verificación de integridad falla.
Usa el encabezado Range
Cuando se realiza la transcodificación, si la solicitud del objeto incluye un encabezado Range
, este se ignora de forma silenciosa. Esto significa que las solicitudes de contenido parcial no se llevan a cabo y la respuesta, en su lugar, entrega el objeto solicitado completo. Por ejemplo, si tienes un objeto de 10 GB elegible para la transcodificación, pero incluyes el encabezado Range: bytes=0-10000
en la solicitud, recibirás el objeto de 10 GB completo.
Este comportamiento surge porque no es posible seleccionar un rango desde un archivo comprimido sin descomprimir el archivo primero en su totalidad: cada solicitud de una parte del archivo estaría acompañada de la descompresión completa de un archivo potencialmente grande, que usaría recursos de modo deficiente. Debes tener en cuenta este comportamiento y evitar usar el encabezado Range
cuando uses la transcodificación, ya que se generan cargos por la transmisión de todo el objeto, no solo del rango solicitado.
Si deseas obtener más información sobre el comportamiento de respuesta permitido para las solicitudes con encabezados Range
, consulta la especificación.
Si se necesitan solicitudes con encabezados Range
, debes asegurarte de que no se realice la transcodificación para el objeto solicitado. Para lograr esto, selecciona las propiedades adecuadas cuando subas objetos. Por ejemplo, las solicitudes de rango para objetos con Content-Type: application/gzip
y sin Content-Encoding
se realizan según lo solicitado.
Pasos siguientes
- Obtén información sobre la marca
--gzip-local
cuando se usagcloud storage cp
, que aplica la codificación de contenido gzip a las cargas de archivos. - Obtén más información para ver y editar los metadatos de objetos.