内联AWS S3显示文件而不是强制下载


81

由于某些原因,我的S3存储桶中的文件被强制下载而不是在线显示,因此,如果我复制图像链接并将其粘贴到地址栏中,然后导航至该链接,它将促使我的浏览器进行下载。相反,我实际上必须单击打开的图像才能转到URL。

从S3更改文件提供方式的任何方法


复制图像链接时,它直接指向图像URL。浏览器仅理解执行提供的URL。
Sunil Gulabani 2013年

@SunilGulabani但我看到使用Amazon s3的站点使您可以直接访问文件,而不必强制下载文件。例如,图像托管站点允许直接图像访问。我指的是直接的文件路径下面是一个例子,这是在我的S3存储桶承载的文件:droplet-files.s3.amazonaws.com/...
氯”

1
我认为您提供的内容类型在上传图片时会出错。它必须是image / jpeg。检查内容类型:en.wikipedia.org/wiki/Internet_media_type
Sunil Gulabani

1
@SunilGulabani我没有向M3发送任何有关MINE类型的数据。我只是简单:$ S3-> putObjectFile($ TMP,$桶,$ actual_image_name,S3 :: ACL_PUBLIC_READ)和whola
氯”

使用$ s3-> create_object($ bucket,$ file_name,array('contentType'=>'image / jpeg','acl'=> AmazonS3 :: ACL_PUBLIC));
Sunil Gulabani 2013年

Answers:


51
$client->putObject(array(
        'Bucket'     => 'buckname',
        'Key'        => $destination,
        'SourceFile' => $source,
        'ContentType' =>'image/jpeg', //<-- this is what you need!
        'ACL'          => 'public-read'//<-- this makes it public so people can see it
    ));

4
感谢'ContentType'=>'image / jpeg',// <-这就是您所需要的!
Alvin Chettiar

2
'ContentType'=>'image / jpeg',窗台将在浏览器中下载URL而不是显示内容
insivika

50

您需要更改内容类型。在S3控制台中,右键单击对象,然后选择“属性”,然后在“元数据”下。您也可以通过编程方式执行此操作:http : //docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type


1
我知道,我之前使用的是$ s3-> putObjectFile($ tmp,$ bucket,$ actual_image_name,S3 :: ACL_PUBLIC_READ),但由于某些原因,我记得我想通过使用存储桶策略来实现相同的目的
Cl'

1
@Cl',您还可以putObject()方法中设置content-type(与putObjectFile()现在一样)。
mathielo 2014年

14

您还需要为内联而不是附件指定内容处置。

$client->putObject(array(
    'Bucket'     => 'buckname',
    'Key'        => $destination,
    'SourceFile' => $source,
    'ContentType' =>'image/jpeg', //<-- this is what you need!
    'ContentDisposition' => 'inline; filename=filename.jpg', //<-- and this !
    'ACL'          => 'public-read'//<-- this makes it public so people can see it
));

3
这对我有用。对于那些希望使此代码可用于任何类型的文件的人,请确保使用'ContentType'=> mime_content_type($ file)
Cary

9

如果您使用的是python,则可以如下设置ContentType

s3 = boto3.client('s3')

mimetype = 'image/jpeg' # you can programmatically get mimetype using the `mimetypes` module
s3.upload_file(
    Filename=local_path,
    Bucket=bucket,
    Key=remote_path,
    ExtraArgs={
        "ContentType": mimetype
    }
)

您也可以在aws cli中获得相同的效果。注意*.jpeg检查s3文档

aws s3 cp \
      --exclude "*" \
      --include "*.jpeg" \
      --content-type="image/jpeg"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://<bucket>/<path>/ \
       s3://<bucket>/<path>/

或者,如果您想一次修改一个对象,则可能要使用s3api copy-object

aws s3api copy-object \
    --content-type="image/jpeg" \
    --metadata-directive="REPLACE" \
    --copy-source "<bucket>/<key>" \
    --bucket "<bucket>" \
    --key "<key>" \
    --acl public-read

2

您可以尝试使用此方法,如果您已经在浏览器中打开了任何URL,则必须强制使用ContentType在浏览器中打开,然后尝试使用隐身方式。

var params = {
            Bucket: config.BUCKET_NAME,
            Key: fileName,
            ContentEncoding: 'base64',
            ContentDisposition: 'inline',
            ContentType: 'image/jpeg',
            Body: buf
        };

2

您可以尝试这个,这对我有用。

const params = {
          Bucket: 'bucket-name',
          Body: file,
          ACL: 'public-read',
          ContentType: contentType,
          ContentEncoding: 'base64',
          ContentDisposition: 'attachment',
        };

您可以从php中的tmp获取contentType。
克里希

1

您也可以从AWS S3控制台更改内容类型。

在此处输入图片说明

然后您会看到侧面弹出,使用它可以手动更改。

在此处输入图片说明


1

我发现如果我们将一个空值传递给 ContentType它将打开文件而不是下载文件。

当上传各种扩展名的文件时,这实际上很好。

$s3->putObject(
[
    'Bucket' => ..,
    'Key' => ..,
    'Body' => ..,
    'ContentType' => '', <---
    'ACL' => 'public-read',
]);

0

如果使用Java SDK的人正在寻找解决方案,则需要将内容类型设置为ObjectMetaData。

ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/png");

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.