用于将 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 的内容类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 multer 将多个图像上传到 AWS S3

如何将图像上传到 s3 存储桶

使用 NodeJS 和 AWS S3 将损坏/截断的 mp4 上传到 S3 存储桶

无法将 Nativescript 图像上传到 S3

允许用户将内容上传到 s3

使用 Amazon Educate Starter 账户将图像上传到 S3