Tệp hiển thị AWS S3 nội dòng thay vì buộc tải xuống


81

Vì một số lý do mà các tệp trong nhóm S3 của tôi đang bị buộc tải xuống thay vì hiển thị trong dòng, vì vậy nếu tôi sao chép một liên kết hình ảnh và dán nó vào thanh địa chỉ rồi điều hướng đến nó, nó sẽ thúc đẩy trình duyệt của tôi tải xuống. Thay vào đó, tôi thực sự phải nhấp vào hình ảnh đang mở để truy cập url.

Bất kỳ cách nào để thay đổi cách phân phối tệp từ S3


Khi bạn sao chép liên kết hình ảnh, liên kết này trực tiếp trỏ đến URL hình ảnh. Browser hiểu đơn giản là thực thi URL được cung cấp.
Sunil Gulabani

@SunilGulabani Nhưng tôi thấy các trang web sử dụng amazon s3 cho phép bạn truy cập tệp trực tiếp mà không cần phải buộc tải tệp xuống. Ví dụ, các trang web lưu trữ hình ảnh cho phép truy cập hình ảnh trực tiếp. Tôi đang đề cập đến đường dẫn tệp trực tiếp, đây là một ví dụ đây là tệp được lưu trữ trong bộ chứa S3 của tôi: droplet-files.s3.amazonaws.com/…
Cl '

1
Tôi nghĩ rằng loại nội dung của bạn đã cung cấp sẽ bị sai khi tải lên hình ảnh. Nó cần phải là image / jpeg. Kiểm tra Loại nội dung: en.wikipedia.org/wiki/Internet_media_type
Sunil Gulabani

1
@SunilGulabani Tôi không gửi bất kỳ dữ liệu nào tới S3 về loại MINE. Tôi chỉ đơn giản là: $ s3-> putObjectFile ($ tmp, $ bucket, $ real_image_name, S3 :: ACL_PUBLIC_READ) và whola
Cl '

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

Câu trả lời:


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
Cảm ơn vì 'ContentType' => 'image / jpeg', // <- đây là những gì bạn cần!
Alvin Chettiar

2
'ContentType' => 'image / jpeg', sill tải xuống url thay vì diplay trong trình duyệt
insivika

50

Bạn cần thay đổi Loại-Nội dung. Từ bảng điều khiển S3, nhấp chuột phải vào đối tượng và chọn Thuộc tính, sau đó nó nằm trong Siêu dữ liệu. Bạn cũng có thể làm điều đó theo chương trình: http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type


1
Tôi hiểu rồi, tôi đã sử dụng $ s3-> putObjectFile ($ tmp, $ bucket, $ real_image_name, S3 :: ACL_PUBLIC_READ) trước đây, nhưng vì lý do nào đó, tôi nhớ lại đã làm điều tương tự mà tôi muốn đạt được khi sử dụng chính sách nhóm
Cl '

1
@Cl ', bạn cũng có thể đặt kiểu nội dung trong putObject()phương thức ( putObjectFile()hiện tại cũng vậy).
mathielo

14

Bạn cũng cần chỉ định Bố trí Nội dung cho tệp đính kèm nội tuyến thay thế.

$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
Điều này đã làm việc cho tôi. Đối với những người muốn mã này hoạt động với bất kỳ loại tệp nào, hãy chắc chắn sử dụng 'ContentType' => mime_content_type ($ file)
Cary

9

nếu bạn đang sử dụng python, bạn có thể đặt ContentType như sau

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

Bạn cũng có thể đạt được điều tương tự trong aws cli. Lưu ý *.jpegKiểm tra tài liệu s3

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

Ngoài ra, nếu bạn muốn sửa đổi từng đối tượng một, bạn có thể muốn sử dụng 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

Bạn có thể thử cái này, ContentType là bắt buộc để mở trong trình duyệt nếu bạn đã mở bất kỳ URL nào trên trình duyệt thì hãy thử ở chế độ ẩn danh.

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

2

Bạn có thể thử cái này, cái này phù hợp với tôi.

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

Bạn có thể lấy contentType từ tmp trong php.
Krish

1

Bạn cũng có thể thay đổi loại nội dung từ Bảng điều khiển AWS S3.

nhập mô tả hình ảnh ở đây

Sau đó, bạn sẽ thấy cạnh bật lên, sử dụng nó để thay đổi nó theo cách thủ công.

nhập mô tả hình ảnh ở đây


1

Tôi phát hiện ra rằng nếu chúng tôi chuyển một giá trị trống cho ContentTypenó sẽ mở tệp thay vì tải xuống.

Điều này thực sự tốt khi tải lên các tệp thuộc tất cả các loại phần mở rộng.

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

0

Trong trường hợp ai đó đang sử dụng Java SDK đang tìm giải pháp cho vấn đề này, bạn cần đặt loại nội dung thành ObjectMetaData.

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

s3client.putObject(new PutObjectRequest
    (bucketName, fileName + ".png", inputStream, 
     objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.