في PHP، أريد تنزيل ملف S3 إلى المتصفح دون تخزينه على الخادم الخاص بي

StackOverflow https://stackoverflow.com/questions/772505

سؤال

لدي ملفات على Amazon's S3. يتم تسميتهم مع معرف فريد لذلك لا توجد مكررة. أنا أو الوصول إليها باستخدام عنوان URL المعتمد. أحتاج إلى أن أكون قادرا على نقلها إلى المتصفح، لكنني بحاجة إلى إعادة تسميته. الآن أنا أستخدم FOPEN، لكنه يقوم بتنزيل الملف إلى خادمي قبل تقديم الملف إلى المتصفح. كيف يمكنني الحصول على "تمرير الملفات" من خلال خادمي إلى المتصفح؟ أو كيف يمكنني المخزن المؤقت للتنزيل - تنزيل قطعة صغيرة إلى الخادم الخاص بي وتمرير ذلك إلى المتصفح أثناء تنزيل الجزء التالي؟

أيضا - أود حقا استخدام CloudFront لكنهم لا يقدمون عناوين URL للموثقة. أعتقد أنه يمكنني استخدام حليقة لإرسال بيانات اعتماد للطلب - هل يمكنني القيام بهذا النوع من الملفات "تمر عبر" خدمة Curl؟

شكرا!

هل كانت مفيدة؟

المحلول

أنا لست على دراية بكيفية عمل S3، لذلك لا أعرف ما إذا كان هذا الحل ممكن. ولكن لم أستطع فقط إعادة توجيه متصفح المستخدم إلى الملف؟ إذا فهمت بشكل صحيح، فإن S3 يسمح لك بإنشاء عناوين URL على الويب لأي من الملفات في دلو الخاص بك. لذلك إذا، قل، يتم دفع هذه التنزيلات، ثم يمكنك لديك S3 إنشاء عنوان URL مؤقت لهذا التنزيل ثم قم بإزالة ذلك بمجرد تنزيل المستخدم.

إذا لم يكن هذا خيارا، فيمكنك تجربة فئات PHP هذه:

  • بروتوكول HTTP عميل - فئة تنفذ طلبات موارد HTTP (المستخدمة من خلال غلاف الدفق أدناه). يسمح بتدفق الطلبات.
  • GHTTP. - غلاف دفق HTTP يتيح لك التعامل مع موارد HTTP البعيدة كملفات، باستخدام وظائف مثل fopen(), fread(), ، إلخ.
  • مجمع تيار الأمازون S3 - مجمع تيار الأمازون S3 من نفس المطور باسم GHTTP. كما يسمح بالموارد النائية التي سيتم الوصول إليها مثل الملفات العادية عبر fopen('s3://...').

يحرر:

هذه الصفحة لديه معلومات حول كيفية "المصادقة مسبقا" طلب من خلال ترميز مفتاح المصادقة في عنوان URL. إنه تحت القسم بعنوان: استعلام سلسلة طلب مصادقة.

// I'm only implementing the parts required for GET requests.
// POST uploads will require additional components.
function getStringToSign($req, $expires, $uri) {
   return "$req\n\n\n$expires\n$uri";
}

function encodeSignature($sig, $key) {
    $sig = utf8_encode($sig);
    $sig = hash_hmac('sha1', $sig, $key);
    $sig = base64_encode($sig);
    return urlencode($sig);
}

$expires = strtotime('+1 hour');
$stringToSign = getStringToSign('GET', $expires, $uri);
$signature = encodeSignature($stringToSign, $awsKey);

$url .= '?AWSAccessKeyId='.$awsKeyId
       .'&Expires='.$expires
       .'&Signature='.$signature;

ثم فقط إعادة توجيه المستخدم إلى $url, ، ويجب أن تكون قادرة على تنزيل الملف. يتم ترميز التوقيع من خلال مخطط تشفير أحادي الاتجاه (SHA1)، لذلك ليس هناك خطر من عدم وجود مفتاح الوصول السري ل AWS.

نصائح أخرى

هل حاولت استخدام http_get، مع طلب_Options لتحديد httpauth و httpauthtype؟ على الرغم من أنني لا أتذكر ما إذا كانت هذه الطريقة تفترض نوعا صالحا سلسلة، فإنه قد لا يعمل من أجل Binary جيدا.

إذا نجح ذلك، يجب أن تكون قادرا على توفير نوع MIME الصحيح والكتابة إلى المتصفح.

هل حاولت بو فقط باستخدام ReadFile ("http: // اسم المستخدم: password@host/filename.ext") ?

سيؤدي ذلك إلى تجاوز وكتابة مباشرة إلى خرج الناتج، ولكن إذا كان نوع المحتوى يتعلق بالقلق، فأنت بحاجة إلى التحقق من ذلك أولا.

يتطلب استخدام عنوان URL EN حيث يتطلب حجة ل ReadFile أيضا إنشاء PHP مع دعم URLWRAPPER.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top