Archivo de visualización de AWS S3 en línea en lugar de forzar la descarga


81

Por alguna razón, los archivos en mi depósito S3 se están forzando como descargas en lugar de mostrarse en línea, por lo que si copio un enlace de imagen y lo pego en la barra de direcciones y luego navego hacia él, mi navegador promoverá la descarga. En su lugar, tengo que hacer clic en la imagen abierta para ir a la URL.

Cualquier forma de cambiar la forma en que se sirven los archivos desde S3


Cuando copia el enlace de la imagen, apunta directamente a la URL de la imagen. El navegador simplemente entiende ejecutar la URL proporcionada.
Sunil Gulabani

@SunilGulabani Pero he visto sitios que usan amazon s3 que le permiten acceder al archivo directamente sin tener que forzar la descarga del archivo. Por ejemplo, los sitios de alojamiento de imágenes permiten el acceso directo a las imágenes. Me refiero a la ruta de archivo directa. Aquí hay un ejemplo, este es un archivo alojado en mi depósito S3: droplet-files.s3.amazonaws.com/…
Cl '

1
Creo que el tipo de contenido que proporcionó será incorrecto al cargar la imagen. Debe ser image / jpeg. Verifique el tipo de contenido: en.wikipedia.org/wiki/Internet_media_type
Sunil Gulabani

1
@SunilGulabani No envío ningún dato a S3 sobre el tipo de MINE. Simplemente: $ s3-> putObjectFile ($ tmp, $ bucket, $ actual_image_name, S3 :: ACL_PUBLIC_READ) y whola
Cl '

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

Respuestas:


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
Gracias por 'ContentType' => 'image / jpeg', // <- ¡esto es lo que necesitas!
Alvin Chettiar

2
'ContentType' => 'image / jpeg', sill descarga la URL en lugar de diplay en el navegador
insivika

50

Necesita cambiar el tipo de contenido. Desde la consola de S3, haga clic con el botón derecho en el objeto y seleccione Propiedades, luego está en Metadatos. También puede hacerlo mediante programación: http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type


1
Ya veo, antes estaba usando $ s3-> putObjectFile ($ tmp, $ bucket, $ actual_image_name, S3 :: ACL_PUBLIC_READ), pero por alguna razón recuerdo haber hecho lo mismo que quiero lograr con el uso de la política de bucket
Cl '

1
@Cl 'también puede establecer el tipo de contenido en el putObject()método (como putObjectFile()es heredado ahora).
mathielo

14

También debe especificar la disposición del contenido para el adjunto en línea.

$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
Esto funcionó para mí. Para aquellos que buscan que este código funcione con cualquier tipo de archivo, asegúrese de usar 'ContentType' => mime_content_type ($ file)
Cary

9

si está utilizando Python, puede configurar ContentType de la siguiente manera

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

También puede lograr lo mismo en aws cli. Nota *.jpegVerifique la documentación de s3

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

Alternativamente, si desea modificar un objeto a la vez, puede usar 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

Puede probar este, ContentType es obligatorio para abrir en un navegador si ya ha abierto cualquier URL en el navegador, luego intente en modo incógnito.

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

2

Puedes probar este, esto funciona para mí.

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

Puede obtener contentType de tmp en php.
Krish

1

También puede cambiar el tipo de contenido desde la consola de AWS S3.

ingrese la descripción de la imagen aquí

Luego verá el lado emergente, úselo para cambiarlo manualmente.

ingrese la descripción de la imagen aquí


1

Descubrí que si le pasamos un valor vacío ContentType, se abrirá el archivo en lugar de descargarlo.

Esto es realmente bueno cuando se cargan archivos de todo tipo de extensiones.

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

0

En caso de que alguien que esté usando Java SDK encuentre una solución para esto, debe establecer el tipo de contenido en ObjectMetaData.

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

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.