অ্যামাজন এস 3 ফাইল ডাউনলোডের নাম পরিবর্তন করুন


102

আমি এস -3 তে একটি জিইউডি সহ কী নাম হিসাবে ফাইলগুলি সঞ্চয় করেছি।

আমি এস 3 আরএসটি এপিআই অনুযায়ী ডাউনলোড করতে একটি প্রাক স্বাক্ষরিত ইউআরএল ব্যবহার করছি

আমি আসল ফাইলের নামটি আমার নিজের ডাটাবেসে সংরক্ষণ করি। যখন কোনও ব্যবহারকারী আমার ওয়েব অ্যাপ্লিকেশন থেকে কোনও ফাইল ডাউনলোড করতে ক্লিক করেন আমি তাদের আসল ফাইলের নামটি ফিরিয়ে দিতে চাই, তবে বর্তমানে তারা যা পায় তা সবই একটি জিআইডি । আমি কীভাবে এটি অর্জন করতে পারি?

আমার ওয়েব অ্যাপ্লিকেশন বিক্রয়শক্তিতে রয়েছে সুতরাং আমার কাছে রেসপন্স করার তেমন নিয়ন্ত্রণ নেই red যাচাই করে সমস্ত ফাইল ওয়েব সার্ভারে ডাউনলোড করে তারপরে গভর্নরের সীমাবদ্ধতার কারণে এটির নাম পরিবর্তন করে।

কিছু HTML পুনর্নির্দেশ, মেটা রিফ্রেশ, জাভাস্ক্রিপ্ট আমি ব্যবহার করতে পারি? এস 3-এর জন্য ডাউনলোড ফাইলের নাম পরিবর্তন করার কোনও উপায় আছে (কেবলমাত্র আমি ভাবতে পারি যে কোনও বিষয়টিকে নতুন নামে কপি করা, এটি ডাউনলোড করা, এবং তারপরে এটি মুছে ফেলা)।

আমি প্রতি ব্যবহারকারীকে বালতি তৈরি করা এড়াতে চাই কারণ আমাদের প্রচুর ব্যবহারকারী থাকবে এবং এখনও প্রতিটি বালতিতে থাকা প্রতিটি ফাইলের একটি অনন্য নাম থাকার গ্যারান্টি নেই

অন্য কোন সমাধান?


7
আর একটি বৈধ তাই প্রশ্ন যে অফ-টপিক হিসাবে বন্ধ! প্রশ্নোত্তরেও বেশিরভাগ সাধারণ প্রশ্ন / উত্তরগুলির চেয়ে বেশি ভোট রয়েছে ...
ডিপস্পেস 101

হ্যাঁ, এটি স্পষ্টতই আরও গুরুত্বপূর্ণ যে আমরা ভবিষ্যতে বা এমনকি এখনও বোঝার নিশ্চয়তা দিচ্ছি না এমন বিষয়টিকে সামনে রেখে কিছুটা নির্বিচারে ব্যবস্থা করার চেষ্টা করি। লোকেরা যখন সফটওয়্যার শিল্পের সাথে সম্পর্কিত প্রশ্নগুলি জিজ্ঞাসা এবং উত্তর দেওয়ার জন্য মজা পেয়েছিল তখন কী ঘটেছিল? এই সংস্থার কারণে আসলে উত্তরটি কে খুঁজে পায়? সফ্টওয়্যারটিতে কোনও সাংগঠনিক কাঠামো কে পুরো শিল্প জুড়ে সুসংগত এবং স্পষ্টভাবে সংজ্ঞায়িত পেয়েছেন? এই সুস্পষ্ট সংজ্ঞা ব্যতীত যে এটির আয়োজনের একটি উল্লেখযোগ্য পরিমাণ স্থায়ী হবে তা হ'ল সময় নষ্ট করা ...
ডেরেক লিটজ

4
আমি এই উত্তরটি খুঁজে পাই, এই সংস্থার সাথে আমার কোনও সমস্যা নেই।
যিশাইয় টার্নার

উত্তর:


83

আমার অনুমান যে আপনার ক্রস এই প্রশ্নগুলি অ্যামাজন এস 3 ফোরামে পোস্ট করেছে , তবে অন্যের পক্ষে আমি উত্তরটি এখানে পোস্ট করতে চাই:

যদি প্রতিটি এস 3 অবজেক্টের জন্য কেবলমাত্র একটি "ব্যবহারকারী ফাইলের নাম" থাকে তবে আপনি ডাউনলোডিং ফাইলের নাম সেট করতে কনটেন্ট-ডিসপজিশন: সংযুক্তি আপনার এস 3 ফাইলে কনটেন্ট-ডিসপজিশন শিরোনাম সেট করতে পারেন; ফাইলের নাম = foo.bar

ন্যায্যতার জন্য আমি উল্লেখ করতে চাই যে আমাজন ফোরামে সঠিক উত্তর সরবরাহ করা আমার পক্ষে নয় এবং সমস্ত ক্রেডিট কলিন রোডসে যেতে হবে ;-)


হ্যাঁ আমাকে মনে করিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ অন্যান্য গুরুত্বপূর্ণ তথ্য হ'ল বিষয়বস্তু-বিভাজন যুক্ত করার সময় এটি কেস-সংবেদনশীল এবং এক্স-এমজেজ উপসর্গের প্রয়োজন হয় না does
ডেভো

4
নীচের উত্তরটি একবার দেখুন, জানুয়ারী ২০১১ সাল থেকে প্রতি জিইটি অনুরোধের ভিত্তিতে এটিও সম্ভব। সুতরাং আপনার যতটা "ব্যবহারকারী ফাইল নাম" থাকা সম্ভব "
ফিবি

4
এটি কাজ করতে আমার ফাইলনামে উদ্ধৃতি যুক্ত করা দরকার ছিল, তাই আমার শিরোনামটি ছিল: সামগ্রী-স্বভাব: সংযুক্তি; ফাইলের নাম = "
foo.bar

4
সি #: রিকোয়েস্ট.আরএসপোনসহাইডারঅভারাইডস। কনটেন্টডিসপজিশন = "সংযুক্তি; ফাইলের নাম = foo.bar";
আমির এম

4
আপনি https://...example.txt?response-content-disposition=attachment;filename=foo.bar
ফ্লাইতে

46

গৃহীত উত্তর সঠিক হলেও আমি এটি খুব বিমূর্ত এবং ব্যবহার করা কঠিন বলে মনে করি।

এখানে নোড.জেএস কোডের একটি অংশ রয়েছে যা বর্ণিত সমস্যার সমাধান করে। প্রাক-স্বাক্ষরিত url উত্পন্ন করতে আমি এডাব্লুএস ল্যাম্বদা হিসাবে এটি সম্পাদন করার পরামর্শ দিচ্ছি।

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বৈশিষ্ট্যটির নোটটি নিন takeparamss3.getSignedUrl

এ getObject ফাংশন ডক অধীনে আরো তথ্য http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property


সম্ভবত এটি সুস্পষ্ট নয়, আমি আরও ভাল করে ব্যাখ্যা করার চেষ্টা করব। ধারণাটি হ'ল আমি ডেটাবেজে আপলোড হওয়া ফাইলগুলির নামের তালিকা রাখি এবং তারপরে কেউ যখন এটি ডাউনলোড করতে চায় তখন আমি originalFilenameপরামিতি সহ ল্যাম্বডাকে চালিত করি ।
পাভেল

27

২০১১ সালের জানুয়ারীর গোড়ার দিকে এস 3 যোগের অনুরোধ শিরোনামকে ওভাররাইড করে। এই কার্যকারিতা আপনাকে পৃথক অনুরোধের জন্য সামগ্রী-বিশৃঙ্খলা শিরোনামকে 'গতিশীল' করতে দেয়।

আরও বিশদের জন্য অবজেক্টগুলি পাওয়ার জন্য এস 3 ডকুমেন্টেশন দেখুন।


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 ব্যবহার করে,

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

আমার একই সমস্যা আছে, আমি সেটটি এইচটিপি শিরোনাম দ্বারা "বিষয়বস্তু-স্বভাব" দ্বারা সমাধান করেছি, ফাইলটি এস 3 এ জমা দেওয়ার সময়, এসডিকে সংস্করণটি পিএইচপি 3.x এর জন্য ডাব্লুএস এসডিকে রয়েছে। এখানে ডকটি 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

দেখে মনে হচ্ছে: প্রতিক্রিয়া_ কনটেন্ট_ডিসপজিশনটি প্রেসিডেন্ট_আরল পদ্ধতিতে নথিভুক্ত। এটিই আমার পক্ষে কাজ করেছিল

    signer = Aws::S3::Presigner.new
    signer.presigned_url(:get_object, bucket: @bucket, key: filename, 
    response_content_disposition: "attachment; filename =#{new_name}")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.