Відображення файлу AWS S3 в рядку замість примусового завантаження


82

З якоїсь причини файли в моєму сегменті S3 примусово завантажуються, а не відображаються в рядку, тому, якщо я скопіюю посилання на зображення та вставлю його в адресний рядок, а потім перейду до нього, він просуне моєму браузеру його завантаження. Натомість мені фактично потрібно натиснути на відкрите зображення, щоб перейти на URL-адресу.

Будь-які способи зміни способу обслуговування файлів із S3


Коли ви копіюєте посилання на зображення, воно безпосередньо вказує на URL-адресу зображення. Браузер просто розуміє виконання вказаної URL-адреси.
Суніл Гулабані

@SunilGulabani Але я бачив сайти, що використовують amazon s3, які дозволяють отримати безпосередній доступ до файлу без необхідності примусового завантаження файлу. Наприклад, сайти хостингу зображень дозволяють здійснювати прямий доступ до зображень. Я маю на увазі прямий шлях до файлу, ось приклад, це файл, розміщений у моєму сегменті S3: droplet-files.s3.amazonaws.com/…
Cl '

1
Я думаю, що ваш тип вмісту буде неправильним під час завантаження зображення. Це має бути image / jpeg. Перевірка типу вмісту: en.wikipedia.org/wiki/Internet_media_type
Суніл Гулабані

1
@SunilGulabani Я не надсилаю ніяких даних до S3 щодо приводу типу MINE. Я просто просто: $ s3-> putObjectFile ($ tmp, $ bucket, $ actual_image_name, S3 :: ACL_PUBLIC_READ) і whola
Cl '

Використовуйте $ s3-> create_object ($ bucket, $ file_name, array ('contentType' => 'image / jpeg', 'acl' => AmazonS3 :: ACL_PUBLIC));
Суніл Гулабані

Відповіді:


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', // <- це те, що вам потрібно!
Елвін Четтіар,

2
'ContentType' => 'image / jpeg', підвіконня завантажує URL-адресу, а не показ у браузері
insivika

51

Вам потрібно змінити тип вмісту. На консолі 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

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)
Кері

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

Ви можете спробувати це, 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',
        };

Ви можете отримати contentType з tmp у php.
Кріш

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

Якщо ви відкриваєте його в режимі інкогніто, він спрацює інакше, ніж з якихось причин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.