وظيفة لإنشاء ملف zip في الذاكرة والعودة كاستجابة HTTP

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أتجنب إنشاء ملفات على القرص، وهذا ما حصلت عليه حتى الآن:

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'). وبعد لا تحتاج إلى قراءتها يدويا.

نصائح أخرى

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

سوف تستنفك الذاكرة إذا كنت تخدم الكثير من هذه الطلبات بشكل متزامن.

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