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

时间:2013-01-04 03:53:23

标签: amazon-web-services amazon-s3

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

有任何方法可以改变从S3提供文件的方式

11 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:29)

$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
    ));

答案 2 :(得分:3)

您还需要指定内容处置以及内联而非附件。

$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 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

enter image description here

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

enter image description here

答案 6 :(得分:1)

我发现,如果我们将空值传递给for product in products: print(product.name) print(product.desciption) print(product.qty) ,它将打开文件而不是下载文件。

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

ContentType

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

如果您以隐身方式打开它,它会工作,但由于某种原因无法工作。

答案 10 :(得分:0)

我今天遇到了同样的问题。问题是 Content-type 属性,当我在 s3 中保存文件时。例如,我正在使用 Spring Boot,并且 s3 中的内容数据在值属性中保存了 application/octet-stream 而不是 image/jpeg。因此,当我打开文件链接时,浏览器下载了文件。

这个问题的解决方法是在s3中保存文件之前更改Content-type