كيف أحذف ملف صورة المستخدم الرمزية؟

مرحبًا بالفريق،

موقعي الإلكتروني https://iosre.com مستضاف في الصين، وكما تعلمون، فإن جميع المواقع الصينية تحتاج إلى تسجيل للحصول على ترخيص من الحكومة، وبالتالي فإن جميع المواقع الصينية تخضع للإشراف.

أبلغ شخص مؤخرًا مزود خدمة CDN الخاص بي، Qiniu، وهو أيضًا شركة صينية، بأن بعض الصور على موقعي غير قانونية. أبلغني مزود خدمة CDN أنني يجب أن أحذف هذه الصور وأقوم بـ “تحديث ذاكرة التخزين المؤقت للرابط”، وإلا فقد يعلقون حسابي وفقًا للقانون. لكنني وجدت أن هذه الصور كانت صورًا رمزية للمستخدمين، ولا أعرف كيف أحذفها.

وفقًا للمعلومات الواردة في How to Delete Uploaded Files? - #3 by codinghorror و How to Delete Uploaded Files? - #25 by Falco سيتم حذف الصور المرفوعة التي لا تحتوي على مراجع تلقائيًا خلال 48 ساعة. لقد استبدلت هذه الصور الرمزية للمستخدمين بالصور الافتراضية الحرفية، لكن لا يبدو أن شيئًا يحدث للصور الرمزية القديمة بعد 72 ساعة، ربما لأن الصور الرمزية للمستخدمين لا تُعتبر صورًا مرفوعة؟

هل لديكم أي أفكار حول كيفية حذف ملفات الصور الرمزية للمستخدمين تمامًا من خادمي؟

شكرًا مقدمًا،
ينغ لو

أعتقد أن الأمر لا يزال يعمل بهذه الطريقة.

من عنوان URL للملف الذي تريد حذفه، استخرج اسم الملف.

cd /var/discourse/shared/uploads
find . -name =FILENAME= | xargs exec rm

ثم قم بأي إجراء لازم لحذفه من شبكة توصيل المحتوى (CDN) الخاصة بك.

شكرًا لك على مساعدتي، لقد حاولت لكن لم ينجح الأمر :frowning:

الملف هو https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png، لذا أفترض أن اسم الملف هو 5414_2.png، صحيح؟

والمسار /uploads يقع تحت /shared/standalone وليس تحت /shared.
ولا يوجد مثل هذا الملف تحت /uploads، كما ترون في سطر الأوامر:

root@iosre:/var/discourse/shared# ls
standalone
root@iosre:/var/discourse/shared# cd standalone/
root@iosre:/var/discourse/shared/standalone# ls
backups  postgres_backup  postgres_run  state  uploads
log      postgres_data    redis_data    tmp
root@iosre:/var/discourse/shared/standalone# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone# cd uploads/
root@iosre:/var/discourse/shared/standalone/uploads# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone/uploads#

هل لديك أي أفكار أخرى؟

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

آسف، هذا موقع شخصي ولا أملك أي ميزانية حاليًا. شكرًا لك على ردك على أي حال!

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

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


تُسمَّى الملفات المرفوعة بناءً على قيمة SHA1 لمحتوى الصورة - قد يساعدك ذلك في العثور على الملف الداعم؟

شيء مثل

a=UserAvatar.where(user_id: 1234)
u=Upload.find(a.custom_upload_id)
upload_url=u.url

ثم

cd /var/discourse/shared/standalone
rm UPLOAD_URL_FROM_ABOVE

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

كيف أقوم بذلك؟ ليس لدي أي فكرة على الإطلاق

على سبيل المثال، هذه الصورة https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png

snakeninny@bogon ~ % shasum /Users/snakeninny/Desktop/5414_2.png.jpeg 
c8d561c5484a1f197abd32995411caaa25e53bd6  /Users/snakeninny/Desktop/5414_2.png.jpeg
root@iosre:~# cd /var/discourse/shared/standalone
root@iosre:/var/discourse/shared/standalone# find ./ -name *c8d561c5484a1f197abd32995411caaa25e53bd6*
root@iosre:/var/discourse/shared/standalone# 

لم أجد أي نتيجة. هل هذا ما تقصده؟ وهل لديك أي اقتراحات؟

هل هذا جزء من كود؟ وأين وكيف يمكنني تنفيذه؟ كنتُ مطور تطبيقات iOS سابقًا، وأنا غير ملم بالبرمجة الأمامية.

هذا مخصص لـ Rails Console. يمكنك الوصول إليه عبر:

cd /var/discourse 
./launcher enter app 
rails c

يمكنك استخدام exit للخروج. وبداخل الحاوية، انتقل إلى /shared بدلاً من المسار الكامل المذكور أعلاه.

بالنسبة للمستخدم lincwee في https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
يعيد UserAvatar.where(user_id: 'lincwee') مصفوفة فارغة. هل لديك أي أفكار؟

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
WARNING: Docker version 17.05.0-ce deprecated, recommend upgrade to 17.06.2 or newer.
root@iosre-app:/var/www/discourse# rails c
[1] pry(main)> a=UserAvatar.where(user_id: 1234)
=> []
[2] pry(main)> a=UserAvatar.where(user_id: lincwee)
NameError: undefined local variable or method `lincwee' for main:Object
from (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

ستحتاج إلى المعرف (ID)، وليس اسم المستخدم.

u = User.find_by(username: "lincwee")

يمكنك بعد ذلك رؤية المعرف أو الوصول إليه عبر u.id

شكرًا لك، لقد نجح الأمر إلى حد ما. لقد شغّلت

cd /var/discourse/shared/
/var/discourse/launcher enter app
rails c

في الطرفية، ثم نفّذت الكود التالي

uid = User.find_by(username: "user_name").id
user_avatars = UserAvatar.where(user_id: uid)
user_avatar = user_avatars[0]
upload_url = Upload.find(user_avatar.custom_upload_id).url

لقائمة جميع روابط الصور الرمزية وحذفتها من خادمك.
لكنني أظن أنني ما زلت بحاجة إلى تحديث النظام/الذاكرة المؤقتة أكثر من ذلك؟ كيف ينبغي لي أن أفعل ذلك؟

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

أشار البريد الإلكتروني الجديد إلى أن الروابط التالية غير قانونية:

https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/64/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/75/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/96/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/90/5414_2.png

كما تلاحظون، فهذه صورتا رمزين تعبيريين (أفاتار) لمستخدمين، وهما ميمز (memes) متعلقة برئيس صيني سابق. مرة أخرى، طلب مني مزوّد شبكة توصيل المحتوى حذف هذه الملفات من الخادم وتحديث شبكة توصيل المحتوى (CDN).

من خلال الروابط، لاحظت أن المستخدمين هما “baal998” و"lincwee". وفقًا لمقطع الكود في منشوري السابق، كان عنوان URL للصورة المرفوعة لـ “lincwee” هو /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg، بينما كان لـ “baal998” هو /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg. ثم قمت بتشغيل الأمر find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* وحذفت جميع الملفات التي تم العثور عليها، وقد نجح الأمر مع “lincwee”. لكن لم أكن محظوظًا مع “baal998”، إذ ما زلتُ أستطيع الوصول إلى https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png رغم عدم وجود أي ملفات تحمل الاسم *cb2188eaeecc3a648f021fa00da4734bd60ca183*.

إذن، أين يُخزّن الرابط https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png بالضبط على خادمي؟ :sob:

همم، هذه موقف صعب. ربما @falco أو شخص آخر عمل على الصور الرمزية مؤخرًا يمكنه أن ينصحك؟

أو لتبسيط الأمر: كيف يقوم Discourse بتحليل زيارة الرابط https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png؟ إذا كان هناك شخص ملم بشفرة المصدر يمكنه إخباري باسم ملف المصدر أو الفئة/الدالة، فسيكون ذلك مفيدًا جدًا. شكرًا!

انظر في نموذج الرفع، أعتقد.

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

بما أن https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png مُستقى من شبكة توزيع المحتوى (CDN)،
فإن https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png يجب أن يكون مُستقى من خادمي، أليس كذلك؟

نعم، ويمكنك رؤية أن الصور تُرسَل من خادمك. لذا، فإن الرابط الذي يجب محاولة إصلاحه هو هذا. بعد أن تمنع إرسال الصور، يمكنك مسح شبكة توصيل المحتوى (CDN).