أخطاء S3 عند تحميل صور الملف الشخصي

أنا أعمل على أحدث إصدار تجريبي وقد فعلت S3 لإدارة الملفات المُحمَّلة.

تعمل التحميلات في المنشورات بشكل صحيح (يتم تحميل الملف إلى S3 وعرضه في المنشور)، لكنني الآن أجد أن محاولة تحميل صور الملفات الشخصية تُنتج أخطاء “Access Denied” في واجهة المستخدم. لا يوجد شيء في سجل الأخطاء الخاص بالمسؤول.

يبدو أن بعض المستخدمين الأوائل تمكنوا من تحميل صور الرموز الشخصية، لكن هذه الصور مخزنة محليًا، على سبيل المثال عند فحص الكود المصدري:

<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="image title" aria-label="Imagery/FIT">

هل توجد طريقة لنقل صور الملفات الشخصية إلى S3، وضمان إمكانية تحميل الصور الجديدة هناك؟

تعديل: كان ينبغي أن أذكر أنني فعّلت تحميل الوسائط الآمن.

إعجاب واحد (1)

هل تستخدم Cloudflare؟ أعتقد أن صور الملفات الشخصية مخزنة بالفعل على S3، ولكنها تمر عبر خادمك. لقد حللت مشكلة مماثلة لهذه (ظهور جميع الصور الرمزية المرفوعة فارغة)، وكان عليّ إضافة عنوان IP للخادم إلى القائمة البيضاء في Cloudflare لإصلاحها.

إعجاب واحد (1)

شكرًا - لكن لا، لا نستخدم CDN، بل نستخدم S3 العادي فقط ولكن مع وسائط آمنة. لست متأكدًا من كيفية التحقق مما إذا كانت الطلبات تتم عبر وكيل، لكن انظر إلى مخرجات رأس curl أدناه:

هذا يوحي لي بأنها ليست عبر وكيل، لكنني لا أعرف بما يكفي لأكون متأكدًا…

curl -I https://example.com/user_avatar/discourse.psy.plymouth.ac.uk/jackie/90/29_2.png
HTTP/2 200 
server: nginx
date: Thu, 09 Sep 2021 11:26:33 GMT
content-type: image/jpeg
content-length: 4068
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: user_avatars/show
last-modified: Thu, 09 Sep 2021 09:38:05 GMT
content-transfer-encoding: binary
cache-control: max-age=31556952, public, immutable

إعجاب واحد (1)

يبدو أن هيكلية عنوان URL هذا متسقة مع صورة رمزية مخزنة عبر وسيط، وهو أمر محير (فإن تنفيذ عناوين URL للصورة الرمزية هنا في Meta يختلف عن مثيلات Discourse القياسية). لا أستطيع الجزم من مخرجات أمر curl ما إذا كانت هناك معلومات تستبعد استخدام Discourse كوسيط لتخزين الصور الرمزية (لست خبيرًا في هذا المجال).

من خلال خبرتي السابقة في هذا الشأن، إذا كانت صور المنشورات تُحمّل إلى S3، فإن الصور الرمزية تُحمّل أيضًا، ما لم يكن هناك إجراء مخصص للغاية. لم أجرب من قبل تحميل الوسائط الآمنة أو استخدام S3 دون وجود شبكة توصيل محتوى (CDN)، وقد يكون لذلك تأثير كبير.

سيكون من الجيد تجربة تحميل صورة رمزية جديدة والتحقق مما إذا كان بإمكانك العثور على الملف في التخزين المحلي أو في حوض S3.

تخميني هو أن المشكلة قد تكون متعلقة بضرورة إدراج عنوان IP للخادم في القائمة البيضاء لدى S3. لست خبيرًا في هذا، لذا نأمل أن يتمكن شخص آخر من الإسهام برأي.

إعجاب واحد (1)

المشكلة هي أن تحميل الملفات إلى S3 يعمل مع المنشورات، لكنه لا يعمل مع تحميل صور الصور الشخصية. أعتقد أن المستخدمين الذين لديهم صور شخصية هم فقط أولئك الذين قاموا بتحميل الصور قبل إعداد S3، لكنني لا أستطيع تأكيد ذلك.

إعجاب واحد (1)

قد يكون هذا مفيدًا: How are avatars stored and accessed? - #5 by DanielMarquard

واجهتُ مشكلةً مشابهة، حيث عملت صور المنشورات، لكن صور الملفات الشخصية لم تُعرض. تم رفع التحميلات بنجاح إلى S3 في كلتا الحالتين، لكن كانت هناك مشكلة في عرضها (عُطلت عناوين IP للخادم بسبب تجاوز حد المعدل/تم حظرها).

إعجابَين (2)

يمكنني التأكيد أنه عند محاولة رفع صورة شخصية، يمتلئ شريط التقدم حتى 100%، ثم يظهر فقط الخطأ: “خطأ: الوصول مرفوض”.

عند فحص وحدة تحكم JavaScript (JS Console)، يظهر الخطأ التالي:

https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
فشل تحميل المورد: استجاب الخادم بحالة 422 ()

وعند اتباع هذا الرابط:

{"errors":["لم يمكن العثور على عنوان URL أو المورد المطلوب."],"error_type":"not_found"}

عند فحص مستودع S3، لم يتم نقل أي شيء إلى مجلد ‘Originals’.

هذا على النقيض من الوضع عند رفع صورة إلى منشور: حيث يعمل كل شيء بشكل صحيح، وتظهر الصورة في مستودع S3، ويتم أيضًا إنشاء صورة مصغرة وتحسينها.

إعجاب واحد (1)

يبدو أن رمز حالة HTTP 422 يعني ‘كيان غير قابل للمعالجة’. وهذا يوحي لي بأن Discourse لا يقبل الملف المرفوع لسبب ما، لكنه قد يكون شيئًا آخر. أعتقد أن 422 تعني ببساطة ‘أن الطلب تم صياغته بشكل صحيح، لكن هناك خطأ ما في الطلب’.

هل الصورة التي تحاول رفعها من نوع غير معتاد أو ربما صورة ضخمة جدًا؟
هل جربت تضمين ملف الصورة هذا بالضبط في منشور؟

يتم تغيير حجم صورة الملف الشخصي (افتراضيًا) إلى عدة أحجام مختلفة، لذا قد يكون هذا هو سبب الفشل لسبب ما، مثل الوصول إلى حد الذاكرة إذا كانت الصورة ضخمة جدًا. لكن هذا مجرد تخمين إلى حد كبير.

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

إعجاب واحد (1)

من المؤكد أن الأمر يتعلق بمعالجة صور الصور الرمزية. لقد جربت ذلك مرة أخرى باستخدام نفس الصورة (باستخدام عميل iOS المحمول هذه المرة)، وقد تم تحميلها بنجاح داخل المنشور، لكنها تظهر نفس خطأ

إعجاب واحد (1)