15

我试图在不指定任何内容类型的情况下将 *.svg 图像上传到 S3。此上传成功,AWS 默认将 Content-Type 设置为 binary/octet-stream。现在,当我尝试在浏览器中使用图像的 S3 url 时,浏览器不会呈现图像并抛出不正确的 mime 类型警告。

为了设置正确的 mime-type,我检查了 AWS 提供的 Content-type 列表,但它没有“image/svg+xml”。

所以我想知道是否有人尝试将 svg 图像上传到 S3?在这种情况下设置的内容类型是什么?或者是否有任何其他兼容的内容类型可用于将 svg 图像上传到 S3?

提前致谢。

4

5 回答 5

22

正如您所提到的,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

于 2013-08-02T06:20:49.873 回答
2

对于那些使用 SDK 的人,这是我用来解决此问题的示例代码片段。我使用 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);
});
于 2020-09-30T15:31:22.063 回答
0

我从您s3cmd用于将文件上传到 S3 的其他答案之一中了解到。该软件包根据文件扩展名对每个文件的 MIME 类型进行了一些有根据的猜测(这里有一个有用的解释

还有一系列选项可以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}

于 2021-09-07T07:48:52.307 回答
-1

如果您想传递内容类型静态并从不在请求中的公共路径获取文件,请使用以下命令:

$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');
}
于 2021-05-07T11:41:58.090 回答
-1

我在 laravel 中上传文件 svg 到 s3 时遇到问题;但适用于下一个代码:

$image = Storage::disk('s3')->put(
            $filePath,
            file_get_contents($file),
            $file->getClientOriginalExtension() === 'svg' ? ['mimetype' => 'image/svg+xml'] : []
        );
于 2021-07-23T17:43:30.493 回答