Amazon S3 फ़ाइल डाउनलोड नाम बदलें


101

मेरे पास कुंजी नाम के रूप में एक GUID के साथ S3 पर संग्रहीत फ़ाइलें हैं।

मैं S3 REST API के अनुसार डाउनलोड करने के लिए एक पूर्व हस्ताक्षरित URL का उपयोग कर रहा हूं

मैं अपने खुद के डेटाबेस में मूल फ़ाइल नाम संग्रहीत करता हूं। जब कोई उपयोगकर्ता मेरे वेब एप्लिकेशन से एक फ़ाइल डाउनलोड करने के लिए क्लिक करता है तो मैं उनका मूल फ़ाइल नाम वापस करना चाहता हूं, लेकिन वर्तमान में वे सभी एक GUID है । इसे कैसे प्राप्त किया जा सकता है?

मेरा वेब ऐप सेल्सफोर्स में है, इसलिए मुझे रिस्पॉन्स करने के लिए ज्यादा नियंत्रण नहीं है। सभी अप्रत्यक्ष रूप से फाइल को वेब सर्वर पर डाउनलोड करते हैं और फिर इसे गवर्नर की सीमाओं के कारण नाम बदल देते हैं।

क्या कुछ HTML रीडायरेक्ट, मेटा रीफ्रेश, जावास्क्रिप्ट I का उपयोग कर सकते हैं? क्या S3 के लिए डाउनलोड फ़ाइल नाम को बदलने का कोई तरीका है (केवल एक चीज जो मैं सोच सकता हूं, वह ऑब्जेक्ट को किसी नए नाम से कॉपी करना है, उसे डाउनलोड करना है, फिर हटाना)।

मैं प्रति उपयोगकर्ता एक बाल्टी बनाने से बचना चाहता हूं क्योंकि हमारे पास बहुत सारे उपयोगकर्ता होंगे और फिर भी कोई गारंटी नहीं होगी कि प्रत्येक बाल्टी में प्रत्येक फ़ाइल का एक अद्वितीय नाम होगा

कोई और उपाय?


6
एक और कानूनी SO प्रश्न जो ऑफ-टॉपिक के रूप में बंद है! प्रश्न और उत्तर भी सामान्य प्रश्नों / उत्तरों के एक विशाल बहुमत की तुलना में अधिक वोट होते हैं ...
DeepSpace101

हां, यह स्पष्ट रूप से अधिक महत्वपूर्ण है कि हम इस तथ्य के सामना में कुछ मनमाने तरीके से चीजों को व्यवस्थित करने का प्रयास करते हैं जो कि भविष्य में या अब भी समझ में आने की गारंटी नहीं है। क्या हुआ जब लोग सिर्फ सॉफ्टवेयर उद्योग से संबंधित सवाल पूछने और जवाब देने में मज़ा करते थे? वास्तव में इस संगठन के कारण उत्तर कौन पाता है? सॉफ्टवेयर में किसी भी संगठनात्मक संरचना को कौन पाता है जो उद्योग के अनुरूप और स्पष्ट रूप से परिभाषित है? इस स्पष्ट परिभाषा के बिना जो समय की एक महत्वपूर्ण राशि का आयोजन करेगा, यह समय की एक बहुत ही बेकार बर्बादी है ...
डेरेक लिट्ज़

1
मुझे यह उत्तर मिल गया है, मेरे पास इस संगठन के साथ कोई समस्या नहीं है।
यशायाह टर्नर

जवाबों:


83

मुझे लगता है कि आपके क्रॉस ने अमेज़ॅन एस 3 फोरम को इस प्रश्न को पोस्ट किया है , लेकिन दूसरों के लिए मैं यहां जवाब पोस्ट करना चाहता हूं:

यदि प्रत्येक S3 ऑब्जेक्ट के लिए केवल एक "उपयोगकर्ता फ़ाइल नाम" है, तो आप डाउनलोडिंग फ़ाइल नाम सेट करने के लिए अपनी s3 फ़ाइल पर सामग्री-विवाद शीर्षक सेट कर सकते हैं: सामग्री-विवाद: अनुलग्नक; फ़ाइल नाम = foo.bar

निष्पक्षता के लिए मैं यह उल्लेख करना चाहूंगा कि अमेज़ॅन फोरम पर सही जवाब देने के लिए यह मैं नहीं था और सभी क्रेडिट कॉलिन रोड्स ;-) पर जाना चाहिए


हाँ, मुझे याद दिलाने के लिए धन्यवाद। महत्वपूर्ण जानकारी का एक अन्य टुकड़ा यह है कि सामग्री-विवाद को जोड़ते समय यह मामले के प्रति संवेदनशील है और इसे एक्स-एमेज़ प्रीफ़िक्स में ज़रूरत नहीं है।
डेवो

3
नीचे दिए गए उत्तर पर एक नज़र डालें, जनवरी 2011 के बाद से यह प्रति GET अनुरोध के आधार पर भी संभव है। इसलिए आपके पास जितने चाहें उतने "उपयोगकर्ता फ़ाइलनाम" होना संभव है।
फेबी

2
मुझे इसे काम करने के लिए फ़ाइलनाम में उद्धरण जोड़ने की आवश्यकता थी, इसलिए मेरा हेडर था: सामग्री-विवाद: लगाव; फ़ाइल नाम = "foo.bar"
nathancahill

1
सी # में: request.esponseHeaderOverrides.ContentDisposition = "अटैचमेंट; फ़ाइल नाम = foo.bar";
आमिर एम

2
आप मक्खी पर प्रतिक्रिया हेडर को ओवरराइड कर सकते हैं:https://...example.txt?response-content-disposition=attachment;filename=foo.bar
अलस्टर

46

जबकि स्वीकृत उत्तर सही है, मुझे यह बहुत ही सारगर्भित और कठिन है।

यहां नोड.जेएस कोड का एक टुकड़ा है जो बताई गई समस्या को हल करता है। मैं इसे पूर्व-हस्ताक्षरित Url उत्पन्न करने के लिए AWS लैम्ब्डा के रूप में निष्पादित करने की सलाह देता हूं।

var AWS = require('aws-sdk');
var s3 = new AWS.S3({
    signatureVersion: 'v4'
});
const s3Url = process.env.BUCKET;

module.exports.main = (event, context, callback) => {
var s3key = event.s3key
var originalFilename = event.originalFilename

var url = s3.getSignedUrl('getObject', {
        Bucket: s3Url,
        Key: s3key,
        Expires: 600,
        ResponseContentDisposition: 'attachment; filename ="' + originalFilename + '"'
    });

[... rest of Lambda stuff...]

}

कृपया, फ़ंक्शन में पारित ऑब्जेक्ट की ResponseContentDispositionविशेषता पर ध्यान दें ।paramss3.getSignedUrl

GetObject फ़ंक्शन के तहत अधिक जानकारी http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property पर प्राप्त करें


शायद यह स्पष्ट नहीं है, मैं बेहतर समझाने की कोशिश करूंगा। विचार यह है कि मैं अपलोड की गई फ़ाइलों के नामों की सूची डेटाबेस में रखता हूं, और फिर जब कोई इसे डाउनलोड करना चाहता है तो मैं लैम्बडा को एक originalFilenameपैरामीटर के रूप में निष्पादित करता हूं ।
पावेल

27

जनवरी 2011 की शुरुआत में S3 ने अनुरोध शीर्ष लेख को ओवरराइड किया। यह कार्यक्षमता आपको व्यक्तिगत अनुरोधों के लिए सामग्री-विवाद हेडर को 'गतिशील रूप से' बदलने की अनुमति देती है।

अधिक विवरण के लिए ऑब्जेक्ट प्राप्त करने पर S3 प्रलेखन देखें।


3

कोड स्निपेट के नीचे जावा AWS SDK को काम करना चाहिए:

GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                new GeneratePresignedUrlRequest(s3Bucket, objectKey)
                .withMethod(HttpMethod.GET)
                .withExpiration(getExpiration());

ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
responseHeaders.setContentDisposition("attachment; filename =\"" + fileName + "\"");

generatePresignedUrlRequest.setResponseHeaders(responseHeaders);

3

AWSSDK का उपयोग करके C # के साथ,

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
    BucketName = BucketName,
    Key = Key,
    Expires = DateTime.Now.AddMinutes(25) 
};

request.ResponseHeaderOverrides.ContentDisposition = $"attachment; filename={FileName}";

var url = s3Client.GetPreSignedURL(request);

0

मेरे पास एक ही मुद्दा है, मैंने इसे सेट किया है http हेडर "सामग्री-स्वभाव" सेट करके एस 3 को फाइल सबमिट करते समय, एसडीके संस्करण PHP 3.x के लिए एडब्ल्यूएस एसडीके है। यहाँ doc http://docs.amazonaws.cn/en_us/aws-sdk-php/latest/api-s3-2006-03-01.html#putobject है

मेरे कोड का एक टुकड़ा

    public function __construct($config) 
    {
        $this->handle = new S3Client([
            'credentials' => array(
                'key' => $config['key'],
                'secret' => $config['secret'],
            ),
            ...
        ]);

        ...
    }

    public function putObject($bucket, $object_name, $source_file, $content_type = false, $acl = 'public-read', $filename = '')
    {
        try {
            $params = [
                'Bucket'      => $bucket,
                'Key'         => $object_name,
                'SourceFile'  => $source_file,
                'ACL'         => $acl,
            ];

            if ($content_type) $params['ContentType'] = $content_type;
            if ($filename) $params['ContentDisposition'] = 'attachment; filename="' . $filename . '"';

            $result = $this->handle->putObject($params);

            ...
        }
        catch(Exception $e)
        {
            ...
        }
    }

0

यह ऐसा दिखता है: response_content_disposition पूर्वनिर्धारित_url विधि में अनिर्दिष्ट है। इसी से मेरा काम बना है

    signer = Aws::S3::Presigner.new
    signer.presigned_url(:get_object, bucket: @bucket, key: filename, 
    response_content_disposition: "attachment; filename =#{new_name}")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.