강제 다운로드 대신 AWS S3 디스플레이 파일 인라인


82

어떤 이유로 내 S3 버킷의 파일이 인라인으로 표시되지 않고 강제로 다운로드되므로 이미지 링크를 복사하여 주소 표시 줄에 붙여 넣은 다음 탐색하면 브라우저가 다운로드하도록 승격됩니다. 대신 실제로 URL로 이동하려면 이미지 열기를 클릭해야합니다.

S3에서 파일이 제공되는 방식을 변경하는 모든 방법


이미지 링크를 복사하면 이미지 URL을 직접 가리 킵니다. 브라우저는 제공된 URL을 실행하기 만하면됩니다.
Sunil Gulabani 2013 년

@SunilGulabani하지만 파일을 강제로 다운로드하지 않고도 파일에 직접 액세스 할 수있는 amazon s3를 사용하는 사이트를 보았습니다. 예를 들어 이미지 호스팅 사이트는 직접 이미지 액세스를 허용합니다. 여기에서 직접 파일 경로를 언급하고 있습니다. 이것은 내 S3 버킷에서 호스팅되는 파일입니다. droplet-files.s3.amazonaws.com/…
Cl '

1
이미지를 업로드하는 동안 제공된 콘텐츠 유형이 잘못된 것 같습니다. 이미지 / jpeg 여야합니다. Content-Type을 확인 : en.wikipedia.org/wiki/Internet_media_type
선일 Gulabani

1
@SunilGulabani MINE 유형과 관련하여 S3에 데이터를 보내지 않습니다. 나는 단지 : $ S3-> putObjectFile ($ TMP, $ 양동이, $ actual_image_name, S3 :: ACL_PUBLIC_READ)과 whola
CL '

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

답변:


52
$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', sill은 브라우저에 표시되는 대신 URL을 다운로드합니다
insivika

51

Content-Type을 변경해야합니다. 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() 수도 있습니다 ( putObjectFile()현재 레거시 처럼 ).
mathielo 2014 년

14

첨부 대신 인라인에 대해서도 Content Disposition을 지정해야합니다.

$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

파이썬을 사용하는 경우 다음과 같이 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에서도 동일한 결과를 얻을 수 있습니다. 참고 s3 문서 *.jpeg확인

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

이것을 시도해 볼 수 있습니다. ContentType은 브라우저에서 이미 URL을 연 다음 시크릿에서 시도하는 경우 브라우저에서 열어야합니다.

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을 얻을 수 있습니다.
Krish

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

0

시크릿 모드에서 열면 어떤 이유로 든 작동하지 않는 것 외에는 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.