You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Terraform为S3对象指定多种Content-Type?

为AWS S3对象配置对应Content-Type的解决方案

你可以通过Terraform的本地变量定义MIME类型映射,结合字符串处理函数提取文件后缀,实现自动匹配对应Content-Type。具体实现如下:

  1. 定义MIME类型映射:创建本地变量,将常见文件后缀与标准Content-Type对应起来,可按需扩展。
  2. 提取后缀并匹配类型:通过正则函数获取文件后缀,转小写后从映射表中查找对应类型,无匹配时使用默认值。

修改后的完整代码:

locals {
  mime_types = {
    "js"   = "application/javascript"
    "jpg"  = "image/jpeg"
    "txt"  = "text/plain"
    "html" = "text/html"
    "css"  = "text/css"
    # 可根据需要添加更多类型,比如png、json等
  }
}

resource "aws_s3_object" "object" {
  for_each = fileset("${path.module}/travel-agency-html-template", "**/*")

  bucket = aws_s3_bucket.My_bucket.bucket
  key    = each.value
  source = "${path.module}/travel-agency-html-template/${each.value}"
  etag   = filemd5("${path.module}/travel-agency-html-template/${each.value}")

  # 提取文件后缀并匹配对应Content-Type,无匹配则用默认二进制流类型
  content_type = lookup(
    local.mime_types,
    lower(try(regex("\\.([^.]+)$", each.value)[0], "")),
    "application/octet-stream"
  )

  depends_on = [aws_s3_bucket_policy.bucket_policy]
}

代码说明

  • local.mime_types:集中维护后缀与Content-Type的映射关系,后续新增文件类型只需在此添加。
  • regex("\\.([^.]+)$", each.value)[0]:用正则提取文件名最后一个.后的后缀部分。
  • try(..., ""):处理无后缀文件的情况,避免正则匹配失败报错。
  • lower(...):统一转小写,兼容HTML、JPG这类大写后缀的文件。
  • lookup(..., "application/octet-stream"):从映射表取值,无匹配时使用通用二进制流类型作为默认值。

内容的提问来源于stack exchange,提问作者charles uneze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:45:02