用于将 svg 图像上传到 AWS S3 的内容类型
Posted
技术标签:
【中文标题】用于将 svg 图像上传到 AWS S3 的内容类型【英文标题】:content-type to be used for uploading svg images to AWS S3 【发布时间】:2013-08-03 06:53:42 【问题描述】:我试图在没有指定任何内容类型的情况下将 *.svg 图像上传到 S3。此上传成功,AWS 默认将 Content-Type 设置为 binary/octet-stream。现在,当我尝试在浏览器中使用图像的 S3 url 时,浏览器不会渲染图像并抛出不正确的 mime 类型警告。
为了设置正确的 mime-type,我检查了 AWS 提供的 Content-type 列表,但它没有“image/svg+xml”。
所以我想知道是否有人尝试将 svg 图像上传到 S3?在这种情况下设置的内容类型是什么?或者是否有任何其他兼容的 Content-type 可用于将 svg 图片上传到 S3?
提前致谢。
【问题讨论】:
【参考方案1】:正如您所提到的,SVG 文件的正确 Content-Type 是“image/svg+xml”。
即使 AWS 控制台没有在 Content-Type 选择字段中提供该值,您仍然可以输入它,S3 会接受它。
AWS 在其 API 文档中为 Content-Type 标头指定以下内容:
描述内容格式的标准 MIME 类型。欲了解更多信息,请转至http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17。
类型:字符串
默认:二进制/八位字节流
有效值:MIME 类型
约束:无
更多详情请见http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
【讨论】:
谢谢 dcro.. 它对我有用,我试图使用旧版本的 s3cmd 上传。因此,即使我尝试使用 Content-type 标头上传,它也会给我错误。 这不在S3层处理;它在应用层处理。您没有在原始帖子中提及如何上传文件。 嗨 Ryan,我正在尝试使用 s3cmd 命令上传。 (s3tools.org/s3cmd)。我想为特定文件设置 mime-type。现在,我通过使用 s3cmd 的 --mime-type 参数来做到这一点。注意:对不起,非常延迟的回复。我没有收到有关此问题的任何 cmets 的任何通知。 :( @RyanParman,你能帮我解决这个问题吗--***.com/questions/18356880/… @UW20989 使用 'image/svg+xml' 类型对你有用吗?任何时候我上传 png/jpeg/gif 都可以,但是如果我上传 svg 我会得到 403 并且它说我的签名不正确。我没有改代码,所以一定是它不喜欢的内容类型。【参考方案2】:对于那些使用 SDK 的人,这是我用来解决此问题的示例代码 sn-p。我使用 javascript (NodeJs)。这是为了补充上面接受的答案,即在上传之前从参数中明确定义 ContentType 为 'image/svg+xml'。
const params =
Bucket: 'bucket',
Key: 'key',
Body: stream,
ACL: 'public-read',
ContentType: 'image/svg+xml',
;
s3.upload(params, function(err, data)
console.log(err, data);
);
【讨论】:
【参考方案3】:我从其他答案之一了解到您正在使用 s3cmd
将文件上传到 S3。该软件包根据文件扩展名对每个文件的 MIME 类型进行了一些有根据的猜测(有一个有用的解释 here)。
s3cmd
也有一系列选项,包括 --no-mime-magic
命令标志(有关信息,请参阅 https://s3tools.org/usage),它有助于 CSS 和其他文件,但不适用于 SVG。
为了让它为我自己的目的工作,我必须使用包含/排除命令标志为 SVG 文件设置一个特定的 Content-Type:
s3cmd sync --content-type 'image/svg+xml' --exclude '*' --include '*.svg' local source S3 bucket URL
因为我还有其他内容,所以我必须有一个单独的 s3cmd
命令来同步其他所有内容:
s3cmd sync --no-mime-magic --content-type 'image/svg+xml' --exclude '*.svg' local source S3 bucket URL
【讨论】:
【参考方案4】:如果你想传递静态内容类型并从不在请求中的公共路径获取文件,那么使用这个:
$destinationPath = public_path("/images/".$image_name);
if (File::exists($destinationPath))
$contents = File::get($destinationPath);
Storage::disk('s3')->put($image_name,$contents,['mimetype' => 'image/svg+xml'],'public');
【讨论】:
【参考方案5】:我在 laravel 中上传文件 svg 到 s3 时遇到问题;但适用于下一个代码:
$image = Storage::disk('s3')->put(
$filePath,
file_get_contents($file),
$file->getClientOriginalExtension() === 'svg' ? ['mimetype' => 'image/svg+xml'] : []
);
【讨论】:
以上是关于用于将 svg 图像上传到 AWS S3 的内容类型的主要内容,如果未能解决你的问题,请参考以下文章