AWS S3-Anzeigedatei inline statt Download erzwingen

81

Aus irgendeinem Grund werden Dateien in meinem S3-Bucket als Downloads erzwungen, anstatt inline angezeigt zu werden. Wenn ich also einen Bildlink kopiere, ihn in die Adressleiste einfüge und dann dorthin navigiere, wird mein Browser zum Herunterladen aufgefordert. Stattdessen muss ich tatsächlich auf das geöffnete Bild klicken, um zur URL zu gelangen.

Alle Möglichkeiten zum Ändern der Art und Weise, wie Dateien von S3 aus bereitgestellt werden

Cl '
quelle
Wenn Sie einen Bildlink kopieren, verweist dieser direkt auf die Bild-URL. Der Browser versteht es einfach, die angegebene URL auszuführen.
Sunil Gulabani
@SunilGulabani Aber ich habe Websites mit Amazon S3 gesehen, mit denen Sie direkt auf die Datei zugreifen können, ohne das Herunterladen der Datei erzwingen zu müssen. Beispielsweise ermöglichen Image-Hosting-Sites den direkten Zugriff auf Bilder. Ich beziehe mich hier auf den direkten Dateipfad. Dies ist ein Beispiel. Dies ist eine Datei, die in meinem S3-Bucket gehostet wird: droplet-files.s3.amazonaws.com/…
Cl '
1
Ich denke, Ihr angegebener Inhaltstyp ist beim Hochladen des Bildes falsch. Es muss Bild / JPEG sein. Überprüfen Sie den Inhaltstyp: en.wikipedia.org/wiki/Internet_media_type
Sunil Gulabani
1
@SunilGulabani Ich sende keine Daten an S3 bezüglich des MINE-Typs. Ich einfach: $ s3-> putObjectFile ($ tmp, $ Bucket, $ actual_image_name, S3 :: ACL_PUBLIC_READ) und whola
Cl '
Verwenden Sie $ s3-> create_object ($ Bucket, $ Dateiname, Array ('contentType' => 'image / jpeg', 'acl' => AmazonS3 :: ACL_PUBLIC));
Sunil Gulabani

Antworten:

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
quelle
4
Danke für 'ContentType' => 'image / jpeg', // <- das ist was du brauchst!
Alvin Chettiar
2
'ContentType' => 'image / jpeg', lädt die URL herunter, anstatt sie im Browser
anzuzeigen
50

Sie müssen den Inhaltstyp ändern. Klicken Sie in der S3-Konsole mit der rechten Maustaste auf das Objekt und wählen Sie Eigenschaften. Es befindet sich dann unter Metadaten. Sie können dies auch programmgesteuert tun: http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type

gregbeaty
quelle
1
Ich habe zuvor $ s3-> putObjectFile ($ tmp, $ Bucket, $ actual_image_name, S3 :: ACL_PUBLIC_READ) verwendet, aber aus irgendeinem Grund erinnere ich mich, dass ich dasselbe getan habe, was ich mit der Bucket-Richtlinie erreichen möchte
Cl '
1
@Cl 'Sie können auch den Inhaltstyp in der putObject()Methode festlegen (wie dies putObjectFile()jetzt der Fall ist).
Mathielo
14

Sie müssen die Inhaltsdisposition auch für Inline-Anhänge angeben.

$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
quelle
3
Das hat bei mir funktioniert. Wenn Sie diesen Code mit jedem Dateityp zum Laufen bringen möchten, verwenden Sie unbedingt 'ContentType' => mime_content_type ($ file)
Cary
9

Wenn Sie Python verwenden, können Sie ContentType wie folgt festlegen

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

Sie können das auch in aws cli erreichen. Hinweis *.jpegÜberprüfen Sie die s3- Dokumentation

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

Wenn Sie alternativ jeweils ein Objekt ändern möchten, können Sie auch das s3api-Kopierobjekt verwenden

aws s3api copy-object \
    --content-type="image/jpeg" \
    --metadata-directive="REPLACE" \
    --copy-source "<bucket>/<key>" \
    --bucket "<bucket>" \
    --key "<key>" \
    --acl public-read
Anthony Awuley
quelle
2

Sie können dies versuchen. ContentType muss in einem Browser geöffnet werden. Wenn Sie bereits eine URL im Browser geöffnet haben, versuchen Sie es inkognito.

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

Sie können dieses versuchen, das funktioniert für mich.

const params = {
          Bucket: 'bucket-name',
          Body: file,
          ACL: 'public-read',
          ContentType: contentType,
          ContentEncoding: 'base64',
          ContentDisposition: 'attachment',
        };
Vishal Pankhaniya
quelle
Sie können contentType von tmp in PHP erhalten.
Krish
1

Sie können den Inhaltstyp auch über die AWS S3-Konsole ändern.

Geben Sie hier die Bildbeschreibung ein

Dann wird die Seite eingeblendet. Verwenden Sie diese Option, um sie manuell zu ändern.

Geben Sie hier die Bildbeschreibung ein

Nerdy Sid
quelle
1

Ich fand heraus, dass, wenn wir einen leeren Wert übergeben, ContentTypedie Datei geöffnet wird, anstatt sie herunterzuladen.

Dies ist eigentlich gut, wenn Sie Dateien aller Art von Erweiterungen hochladen.

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

Wenn jemand, der Java SDK verwendet, eine Lösung dafür findet, müssen Sie den Inhaltstyp auf ObjectMetaData setzen.

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

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