اذهب إلى المحتوى

السؤال

نشر

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

على سبيل المثال، أود أن يكون عنوان URL مثل هذا:

http://example.com/download/?f=somefile.txt

وعلى الخادم، أعلم أن جميع الملفات القابلة للتنزيل موجودة في المجلد /home/user/files/ بشكل إفتراضي. هل هناك طريقة لجعل جانغو Django يقدم هذا الملف للتنزيل بدلاً من محاولة العثور على عنوان URL ووضعه في view مخصص؟

Recommended Posts

  • 1
نشر

يمكنك إستخدام الوحدة X-Sendfile: حيث ينشئ django المسار إلى الملف، ولكن يتم معالجة تقديم الملف الفعلي بواسطة Apache / Lighttpd. بمجرد قيامك بإعداد mod_xsendfile، فإن إستخدامه مع العرض الخاص بك يستغرق بضعة أسطر فقط:

from django.utils.encoding import smart_str

res = HttpResponse(content_type='application/force-download')
res['Content-Disposition'] = f"attachment; filename={smart_str(file_name)}"
res['X-Sendfile'] = smart_str("path/to/file")
return res

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

ملاحظة: هذه الطريقة لا تعمل إلا مع الملفات التي لديها أسماء من رموز ASCII فقط، وأي ملفات تحمل أسماء برموز مختلفة (حروف عربية، صينية، رموز إموجي .. إلخ) لن تعمل وستسبب خطأ لأن الوجدة X-Sendfile لا يمكنها التعامل مع رموز غير رموز ASCII.

ملاحظة: إذا كنت تستعمل Django بإصدار أقدم من 1.7 فيجب أن تستخدم mimetype كما في المثال التالي، حيث تم استبدال mimetype بـ content_type في الإصدار 1.7

response = HttpResponse(mimetype='application/force-download') # < 1.7

 

  • 0
نشر

يمكنك استخدام الكود التالي

from wsgiref.util import FileWrapper
from django.http import HttpResponse

filename = "/home/stackoverflow-addict/private-folder(not-porn)/image.jpg"
wrapper = FileWrapper(file(filename))
response = HttpResponse(wrapper, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename)
response['Content-Length'] = os.path.getsize(filename)
return response

يمكنك من خلال الكود تخزين الملفات في مسار خاص أنت تحدده وعرضها عبر django لبعض المستخدمين أو في أوقات معينة 

  • 0
نشر

أيضاً للحصول على حل بسيط للغاية لاستخدمه في النماذج الأولية يمكنك فقط استخدام طريقة عرض django المدمجة. هذا الحل ممتاز للنماذج الأولية أو العمل لمرة واحدة:

from django.views.static import serve
file = '/some/path/to/local/file.txt'
return serve(request, os.path.basename(file), os.path.dirname(file))

لكن كما ذكرت يصلح للنماذج الأولية وليس للاستخدام العملي.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...