Amazon web services AWS S3以内联方式显示文件,而不是强制下载

Amazon web services AWS S3以内联方式显示文件,而不是强制下载,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,由于某些原因,我的S3存储桶中的文件被强制下载,而不是在线显示。因此,如果我复制一个图像链接并将其粘贴到地址栏中,然后导航到地址栏,它将促使我的浏览器下载它。相反,我实际上必须点击打开的图像才能转到url 要更改从S3提供文件的方式,您需要更改内容类型。在S3控制台中,右键单击对象并选择Properties,然后它位于Metadata下。您还可以通过编程方式执行此操作:$client->putObject(数组)( “Bucket”=>“buckname”, “Key”=>$destinatio

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


要更改从S3提供文件的方式,您需要更改内容类型。在S3控制台中,右键单击对象并选择Properties,然后它位于Metadata下。您还可以通过编程方式执行此操作:

$client->putObject(数组)(
“Bucket”=>“buckname”,
“Key”=>$destination,
'SourceFile'=>$source,

“ContentType”=>“image/jpeg”,//“public read”//您还需要为内联附件指定内容配置

$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
));
$client->putObject(数组)(
“Bucket”=>“buckname”,
“Key”=>$destination,
'SourceFile'=>$source,

“ContentType”=>“image/jpeg”、//“inline;filename=filename.jpg”、//“public read”//如果您使用的是python,则可以设置

您也可以在aws cli中实现同样的功能。注意
*.jpeg
检查文档

aws s3 cp \
      --exclude "*" \
      --include "*.jpeg" \
      --content-type="image/jpeg"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://<bucket>/<path>/ \
       s3://<bucket>/<path>/
aws s3 cp\
--排除“*”\
--包括“*.jpeg”\
--content type=“图像/jpeg”\
--元数据指令=“替换”\
--递归的\
--干跑步\
s3:///\
s3:////
或者,如果您希望一次修改一个对象,您可能希望使用

aws s3api复制对象\
--content type=“图像/jpeg”\
--元数据指令=“替换”\
--复制源“/”\
--桶“\
--键“”\
--acl公共读取

您可以尝试此选项,ContentType对于在浏览器中打开是必需的。如果您已经在浏览器上打开了任何URL,请尝试匿名

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

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

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

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));

你可以试试这个,这个适合我

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

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

然后你会看到侧面弹出,用它来手动改变它


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

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

$s3->putObject(
[
    'Bucket' => ..,
    'Key' => ..,
    'Body' => ..,
    'ContentType' => '', <---
    'ACL' => 'public-read',
]);
$s3->putObject(
[
“Bucket”=>。。,
“键”=>。。,
“主体”=>。。,
'内容类型'=>'','公共读取',
]);

如果你以匿名方式打开它,它将正常工作,而不是因为某种原因无法正常工作。

复制图像链接时,它直接指向图像URL。浏览器只需执行提供的URL即可。@SunilGulabani但我看到过使用amazon s3的网站,这些网站允许你直接访问文件,而无需强制下载文件。例如,图像托管站点允许直接访问图像。我指的是直接文件路径。这里是一个示例,这是一个托管在我的S3存储桶中的文件:我认为您提供的内容类型在上载图像时会出错。它需要为image/jpeg。检查内容类型:@SunilGulabani我不向S3发送任何关于MI的数据我只是简单地:$s3->putObjectFile($tmp,$bucket,$actual_image_name,s3::ACL_PUBLIC_READ)和wholaUse$s3->create_object($bucket,$file_name,array('contentType'=>'image/jpeg','ACL'=>AmazonS3::ACL_PUBLIC));我明白了,我在使用$s3->putObjectFile($tmp,$bucket,$actual_image_name,s3::ACL_PUBLIC_READ)以前,但由于某种原因,我记得我做了同样的事情,我想通过使用bucket来实现policy@Cl'您也可以(因为
putObjectFile()
现在是遗留的)。感谢您提供的“ContentType”=>“image/jpeg”、//“ContentType”=>“image/jpeg”,sill将下载url,而不是直接播放browser@insivika尝试在匿名浏览器中打开。我遇到了同样的问题,当我以匿名模式打开时,它对我有效。这对我有效。对于那些希望使此代码与任何类型的文件一起工作的人,请确保使用“Cont”entType'=>mime\u content\u type($file)您可以在php中从tmp获取contentType。我在python中也遇到了同样的问题,添加了“bucket.put\u对象(Key=Key,Body=strdata,ACL='public-read',contentType='text/html'),它成功了。
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/png");

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));
const params = {
          Bucket: 'bucket-name',
          Body: file,
          ACL: 'public-read',
          ContentType: contentType,
          ContentEncoding: 'base64',
          ContentDisposition: 'attachment',
        };
$s3->putObject(
[
    'Bucket' => ..,
    'Key' => ..,
    'Body' => ..,
    'ContentType' => '', <---
    'ACL' => 'public-read',
]);