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

Cl '
fuente
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
    ));
Neo
fuente
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

Gregbeaty
fuente
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
));
Alin Razvan
fuente
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
Anthony Awuley
fuente
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
        };
Ankit Kumar Rajpoot
fuente
2

Puedes probar este, esto funciona para mí.

const params = {
          Bucket: 'bucket-name',
          Body: file,
          ACL: 'public-read',
          ContentType: contentType,
          ContentEncoding: 'base64',
          ContentDisposition: 'attachment',
        };
vishal pankhaniya
fuente
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í

Sid nerd
fuente
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',
]);
Líneas de código
fuente
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));
vigamage
fuente