وظيفة لإنشاء ملف zip في الذاكرة والعودة كاستجابة HTTP
سؤال
أنا أتجنب إنشاء ملفات على القرص، وهذا ما حصلت عليه حتى الآن:
def get_zip(request):
import zipfile, StringIO
i = open('picture.jpg', 'rb').read()
o = StringIO.StringIO()
zf = zipfile.ZipFile(o, mode='w')
zf.writestr('picture.jpg', i)
zf.close()
o.seek(0)
response = HttpResponse(o.read())
o.close()
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = "attachment; filename=\"picture.zip\""
return response
هل تعتقد أن الأناقة الصحيحة - أثمر بما فيه الكفاية؟ أي طريقة أفضل للقيام بذلك؟
شكرا!
المحلول
بالنسبة StringIO
يجب عليك استخدام عموما o.getvalue()
للحصول على النتيجة. أيضا، إذا كنت ترغب في إضافة ملف عادي إلى ملف ZIP، يمكنك استخدامه zf.write('picture.jpg')
. وبعد لا تحتاج إلى قراءتها يدويا.
نصائح أخرى
يمكن لتجنب ملفات القرص إبطاء الخادم الخاص بك على الزحف، ولكنه بالتأكيد سوف يعمل.
سوف تستنفك الذاكرة إذا كنت تخدم الكثير من هذه الطلبات بشكل متزامن.
لا تنتمي إلى StackOverflow