AWS S3 डिस्प्ले फ़ाइल इनलाइन के बजाय बल डाउनलोड करें


82

किसी कारण से मेरी S3 बाल्टी में फ़ाइलों को लाइन में प्रदर्शित करने के बजाय डाउनलोड के रूप में मजबूर किया जा रहा है, इसलिए यदि मैं एक छवि लिंक की प्रतिलिपि बनाता हूं और इसे पता बार में पेस्ट करता हूं और फिर इसे नेविगेट करता हूं, तो यह डाउनलोड करने के लिए मेरे ब्राउज़र को बढ़ावा देगा। इसके बजाय मुझे वास्तव में यूआरएल पर जाने के लिए खुली छवि पर क्लिक करना होगा।

किसी भी तरह से फाइल को एस 3 से बदलने के तरीके


जब आप छवि लिंक की प्रतिलिपि बनाते हैं, तो यह सीधे छवि URL की ओर इशारा करता है। ब्राउज़र बस प्रदान किए गए URL को निष्पादित करना समझता है।
सुनील गुलाबानी

@SunilGulabani लेकिन मैंने amazon s3 का उपयोग करने वाली साइटें देखीं जो आपको फ़ाइल को डाउनलोड करने के लिए मजबूर किए बिना सीधे फ़ाइल तक पहुंचने की अनुमति देती हैं। उदाहरण के लिए इमेज होस्टिंग साइट्स डायरेक्ट इमेज एक्सेस की अनुमति देती हैं। मैं यहाँ सीधे फ़ाइल-पथ की बात कर रहा हूँ, यह एक उदाहरण है यह मेरी S3 बाल्टी में होस्ट की गई फ़ाइल है: droplet-files.s3.amazonaws.com/ ...
Cl '

1
मुझे लगता है कि छवि अपलोड करते समय आपका प्रदान किया गया सामग्री प्रकार गलत होगा। यह छवि / जेपीईजी होना चाहिए। सामग्री प्रकार के लिए जाँच करें: en.wikipedia.org/wiki/Internet_media_type
सुनील गुलाबानी

1
@SunilGulabani मैं M3 प्रकार के संबंध में S3 को कोई डेटा नहीं भेजता। मैं अभी-अभी: $ s3-> putObjectFile ($ tmp, $ बाल्टी, $ real_image_name, S3 :: ACL_PUBLIC_READ) और whola
Cl '

$ S3-> create_object ($ बाल्टी, $ file_name, array ('contentType' => 'image / jpeg', 'acl' => AmazonS3 :: ACL_PUBLIC) का उपयोग करें;
सुनील Gulabani

जवाबों:


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

4
'ContentType' => 'image / jpeg' के लिए धन्यवाद, // <- यह वही है जो आपको चाहिए!
एल्विन चेट्टियार

2
'ContentType' => 'image / jpeg', sill ब्राउज़र में url के बजाय url डाउनलोड करता है
insivika

51

आपको सामग्री-प्रकार बदलने की आवश्यकता है। S3 कंसोल से, ऑब्जेक्ट पर राइट क्लिक करें और प्रॉपर्टीज़ का चयन करें, फिर यह मेटाडेटा के अंतर्गत है। आप इसे प्रोग्रामेटिक रूप से भी कर सकते हैं: http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/change_content_type


1
मैं देखता हूं, मैं इससे पहले $ s3-> putObjectFile ($ tmp, $ बाल्टी, $ वास्तविक_image_name, S3 :: ACL_PUBLIC_READ) का उपयोग कर रहा था, लेकिन किसी कारण से मुझे याद है कि मैं बाल्टी नीति
Cl 'के

1
@Cl 'आप सामग्री-प्रकार को putObject()विधि में भी सेट कर सकते हैं (जैसा putObjectFile()कि अभी विरासत है)।
मैथिलियो

14

आपको अनुलग्नक के बजाय इनलाइन के लिए सामग्री विवाद को निर्दिष्ट करने की आवश्यकता है।

$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
इसने मेरे लिए काम किया। किसी भी प्रकार की फ़ाइल के साथ काम करने वाले इस कोड को पाने के लिए 'ContentType' => mime_content_type ($ file) का उपयोग करना सुनिश्चित करें
Cary

9

यदि आप अजगर का उपयोग कर रहे हैं, तो आप निम्न प्रकार से ContentType सेट कर सकते हैं

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

आप अवीस क्ली में भी वही हासिल कर सकते हैं। नोट s3 प्रलेखन की *.jpegजाँच करें

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

वैकल्पिक रूप से यदि आप एक समय में एक वस्तु को संशोधित करना चाहते हैं तो आप s3api कॉपी-ऑब्जेक्ट का उपयोग करना चाहते हैं

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

2

आप इसे आज़मा सकते हैं, ContentType किसी ब्राउज़र में खुले के लिए अनिवार्य है यदि आपने पहले ही ब्राउज़र पर कोई URL खोला है तो गुप्त में आज़माएँ।

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

2

आप यह कोशिश कर सकते हैं, यह मेरे लिए काम करता है।

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

आप tp से php में contentType प्राप्त कर सकते हैं।
कृष

1

आप AWS S3 कंसोल से भी सामग्री प्रकार बदल सकते हैं।

यहाँ छवि विवरण दर्ज करें

फिर आपको साइड पॉप अप देखने को मिलेगा, इसे मैन्युअल रूप से बदलने के लिए उपयोग करें।

यहाँ छवि विवरण दर्ज करें


1

मुझे पता चला कि यदि हम ContentTypeइसे खाली मान देते हैं तो डाउनलोड करने के बजाय फाइल को खोल देगा।

सभी प्रकार के एक्सटेंशन की फ़ाइलों को अपलोड करते समय यह वास्तव में अच्छा है।

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

0

यदि कोई व्यक्ति जो जावा एसडीके का उपयोग कर रहा है, तो इसके लिए एक समाधान ढूंढ रहा है, आपको ऑब्जेक्ट प्रकार को ऑब्जेक्टमैटाडाटा में सेट करना होगा।

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

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

0

यदि आप इसे गुप्त में खोलते हैं तो यह इसके अलावा काम करेगा कि यह किसी कारण से काम नहीं करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.