Plik wyświetlania AWS S3 w tekście zamiast wymuszonego pobierania

82

Z jakiegoś powodu pliki w moim segmencie S3 są wymuszane jako pliki do pobrania zamiast wyświetlać je w linii, więc jeśli skopiuję link do obrazu i wkleię go w pasku adresu, a następnie przejdę do niego, moja przeglądarka będzie promować to, aby go pobrać. Zamiast tego muszę kliknąć otwarty obraz, aby przejść do adresu URL.

Wszelkie sposoby zmiany sposobu obsługi plików z S3

Cl '
źródło
Kiedy kopiujesz link do obrazu, wskazuje on bezpośrednio na adres URL obrazu. Przeglądarka po prostu rozumie, że ma wykonać podany adres URL.
Sunil Gulabani,
@SunilGulabani Ale widziałem witryny używające amazon s3, które umożliwiają bezpośredni dostęp do pliku bez konieczności wymuszania pobierania pliku. Na przykład witryny hostujące obrazy umożliwiają bezpośredni dostęp do obrazów. Mam na myśli bezpośrednią ścieżkę do pliku. Oto przykład, to jest plik hostowany w moim zasobniku
Cl '
1
Myślę, że podany typ zawartości będzie nieprawidłowy podczas przesyłania obrazu. Musi to być image / jpeg. Sprawdź typ zawartości: en.wikipedia.org/wiki/Internet_media_type
Sunil Gulabani,
1
@SunilGulabani Nie wysyłam żadnych danych do S3 z pozdrowieniami typu MINE. Po prostu: $ s3-> putObjectFile ($ tmp, $ bucket, $ real_image_name, S3 :: ACL_PUBLIC_READ) i whola
Cl '
Użyj $ s3-> create_object ($ bucket, $ file_name, array ('contentType' => 'image / jpeg', 'acl' => AmazonS3 :: ACL_PUBLIC));
Sunil Gulabani

Odpowiedzi:

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
    ));
Neo
źródło
4
Dzięki za 'ContentType' => 'image / jpeg', // <- to jest to, czego potrzebujesz!
Alvin Chettiar
2
„ContentType” => „image / jpeg”, nadal pobiera adres URL zamiast wyświetlać w przeglądarce
insivika
51

Musisz zmienić Content-Type. W konsoli S3 kliknij prawym przyciskiem myszy obiekt i wybierz Właściwości, a następnie znajduje się w obszarze Metadane. Możesz to również zrobić programowo: http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type

gregbeaty
źródło
1
Widzę, że wcześniej używałem $ s3-> putObjectFile ($ tmp, $ bucket, $ real_image_name, S3 :: ACL_PUBLIC_READ), ale z jakiegoś powodu przypominam sobie, że robiłem to samo, co chcę osiągnąć za pomocą polityki wiadra
Cl '
1
@Cl 'możesz również ustawić typ zawartości w putObject()metodzie (tak jak putObjectFile()jest teraz starsze).
mathielo
14

Musisz również określić dyspozycję treści dla wbudowanego zamiast załącznika.

$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
źródło
3
To zadziałało dla mnie. Dla tych, którzy chcą, aby ten kod działał z dowolnym typem pliku, użyj 'ContentType' => mime_content_type ($ file)
Cary
9

jeśli używasz Pythona, możesz ustawić ContentType w następujący sposób

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

Możesz również osiągnąć to samo w AWS CLI. Uwaga *.jpegSprawdź dokumentację s3

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

Alternatywnie, jeśli chcesz modyfikować jeden obiekt na raz, możesz użyć funkcji kopiowania obiektu s3api

aws s3api copy-object \
    --content-type="image/jpeg" \
    --metadata-directive="REPLACE" \
    --copy-source "<bucket>/<key>" \
    --bucket "<bucket>" \
    --key "<key>" \
    --acl public-read
Anthony Awuley
źródło
2

Możesz wypróbować ten, ContentType jest obowiązkowy do otwarcia w przeglądarce, jeśli już otworzyłeś dowolny adres URL w przeglądarce, a następnie spróbuj w trybie incognito.

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

Możesz spróbować tego, to działa dla mnie.

const params = {
          Bucket: 'bucket-name',
          Body: file,
          ACL: 'public-read',
          ContentType: contentType,
          ContentEncoding: 'base64',
          ContentDisposition: 'attachment',
        };
vishal pankhaniya
źródło
Możesz pobrać contentType z tmp w php.
Krish
1

Możesz również zmienić typ zawartości z konsoli AWS S3.

wprowadź opis obrazu tutaj

Następnie zobaczysz wyskakującą stronę, użyj tego, aby zmienić ją ręcznie.

wprowadź opis obrazu tutaj

Nerdy Sid
źródło
1

Dowiedziałem się, że jeśli przekażemy do niego pustą wartość ContentType, otworzy plik zamiast pobierać.

Jest to naprawdę przyjemne podczas przesyłania plików wszelkiego rodzaju rozszerzeń.

$s3->putObject(
[
    'Bucket' => ..,
    'Key' => ..,
    'Body' => ..,
    'ContentType' => '', <---
    'ACL' => 'public-read',
]);
Linesofcode
źródło
0

W przypadku, gdy ktoś, kto używa Java SDK, znajduje rozwiązanie tego problemu, musisz ustawić typ zawartości na ObjectMetaData.

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

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));
wigamowanie
źródło
0

Jeśli otworzysz go w trybie incognito, zadziała inaczej niż z jakiegoś powodu.

kd12345
źródło