قبل معالجة DOCX وEPUB، قم بتعيين ميزانية لإلغاء ضغط ZIP
DOCX هو في الأساس مجموعة من إدخالات ZIP، ويستخدم EPUB أيضًا حاوية ZIP. إن مجرد استلام ملف مضغوط صغير جدًا لا يعني أنه سيظل أصغر بعد فك ضغطه. يجب أن يكون حجم الضغط وعدد الإدخالات وحجم العنصر الفردي ومقدار التوسيع الإجمالي محدودًا عند نقطة الإدخال، بدلاً من انتظار نفاد الذاكرة قبل تحديد أن الملف غير طبيعي.
عند التعامل مع DOCX وEPUB، تنشأ بالفعل العديد من المشكلات أثناء مرحلة إلغاء الضغط. DOCX هو في الأساس مجموعة من إدخالات ZIP، ويستخدم EPUB أيضًا حاوية ZIP، وبالتالي فإن حجم الملف الصغير لا يعني أنه سيكون أصغر بعد فك الضغط. هذه المقالة مخصصة للمطورين وموظفي التشغيل والصيانة الذين يحتاجون إلى تلقي مستندات Office أو الكتب الإلكترونية وإجراء المعالجة اللاحقة. فهو يقدم كيفية تحديد ميزانية لإلغاء ضغط ZIP عند المدخل.
بعد قراءة هذا، يمكنك تحديد القيود التي يجب وضعها عند المدخل، وكيفية إرجاع معلومات الرفض القابلة للتنفيذ إلى المستخدم، وكيفية التمييز بين مشكلات الحاوية ومشكلات الترجمة عند فشل الترجمة. تم توضيح الأمثلة الموجودة في هذه المقالة باستخدام عينات تركيبية، وقد اجتازت التعليمات البرمجية اختبارات العينة في بيئة معزولة، ولكن هذا لا يعني أنها صالحة لجميع الملفات الحقيقية. قبل معالجة المستندات المهمة، يرجى الاحتفاظ بالنسخ الأصلية ومراجعتها وفقًا للحدود وبنود القبول في النص.
كيف يمكن تحديد ميزانية لإلغاء ضغط ZIP قبل معالجة DOCX وEPUB؟ استنتاج جملة واحدة
يجب أن يكون حجم الضغط وعدد الإدخالات وحجم العنصر الفردي ومقدار التوسيع الإجمالي محدودًا عند نقطة الإدخال. لا تنتظر حتى نفاد الذاكرة قبل اكتشاف خلل في الملف.
| حالتك | الممارسات الموصى بها | سبب |
|---|---|---|
| تلقي ملف مضغوط DOCX أو EPUB | حدد حجم الضغط وعدد الإدخالات وحجم العنصر الفردي وإجمالي مقدار التوسيع عند المدخل | صغر حجم الحزمة المضغوطة لا يعني أنها ستكون أصغر بعد فك الضغط عنها. |
| أريد إجراء فحص مسبق بناءً على الكتالوج فقط. | يتم استخدام جدول الدليل للرفض المبكر أثناء تجميع وحدات البايت المقروءة أثناء إلغاء الضغط. | لا تعد جداول الكتالوج بديلاً لقيود وقت التشغيل |
| مستند كبير بشكل معقول يتجاوز الميزانية | توفير قائمة انتظار ملفات كبيرة مستقلة أو مدخل معالجة يدوي | قد تتجاوز الوثائق المعقولة أيضًا الميزانية، ولكن لا ينبغي أن تزيل جميع القيود |
| فشلت الترجمة | قم أولاً بالتمييز بين تلف الحاوية وفشل الترجمة | قد تكمن المشكلة في مرحلة إعداد المدخلات |
لماذا نحتاج إلى النظر إلى الحجم الموسع أولاً؟
يستخدم كل من DOCX وEPUB ملف ZIP كحاوية. قد يشغل ملف يبلغ حجمه عدة مئات من الكيلوبايت مساحة كبيرة بعد تفريغه. إذا نظر النظام فقط إلى حجم الملف الذي تم تحميله، فلن يتمكن من اكتشاف هذا النوع من المخاطر.
لذلك يجب أن يشمل التفتيش عند المدخل الجوانب التالية في نفس الوقت:
- حجم الضغط: تحديد حجم الملف الذي تم تحميله نفسه.
- عدد الإدخالات: تحديد عدد الملفات داخل الحاوية.
- حجم العنصر الفردي: تحديد الحجم الموسع لأي عنصر واحد.
- إجمالي التوسيع: تحديد إجمالي عدد البايتات بعد توسيع كافة الإدخالات.
تحقق من جدول المحتويات أولاً، لكن لا تعتبره ضمانًا نهائيًا
توفر ZipInfo الحجم المعلن والحجم المضغوط، المناسب للفحص المسبق. فهو يساعد النظام على رفض الملفات التي تتجاوز الميزانية بشكل واضح قبل فك الضغط.
ومع ذلك، يتم الإعلان عن المعلومات الموجودة في جدول الدليل بواسطة الملف نفسه ولا يمكن الوثوق بها بشكل كامل. عند فك الضغط فعليًا، لا تزال بحاجة إلى تجميع البايتات التي تمت قراءتها وتعيين ميزانية الوقت والذاكرة. يمكن أن ترفض جداول الكتالوج الملفات مبكرًا، لكنها لا يمكن أن تحل محل قيود وقت التشغيل.
مثال على الفحص المسبق بدون فك الضغط
from io import BytesIO
from pathlib import PurePosixPath
from zipfile import ZipFile, ZIP_DEFLATED
def inspect(raw, max_entries=10, max_total=4096):
if len(raw) > 4096:
raise ValueError("compressed input budget")
with ZipFile(BytesIO(raw)) as z:
items = z.infolist()
if len(items) > max_entries:
raise ValueError("entry count budget")
total, seen = 0, set()
for item in items:
name = item.filename
path = PurePosixPath(name)
if (path.is_absolute() or ".." in path.parts or
"\\" in name or ":" in name or name in seen):
raise ValueError("unsafe or duplicate name")
seen.add(name)
total += item.file_size
if total > max_total:
raise ValueError("expanded budget")
return len(items), total
def sample(name, data):
out = BytesIO()
with ZipFile(out, "w", ZIP_DEFLATED) as z:
z.writestr(name, data)
return out.getvalue()
assert inspect(sample("word/document.xml", b"<doc/>")) == (1, 6)
for raw in [sample("../escape", b"x"), sample("large", b"x" * 5000)]:
try:
inspect(raw)
except ValueError:
pass
else:
raise AssertionError("unsafe archive accepted")
الميزانيات في هذا المثال عبارة عن قيم صغيرة تم اختيارها لتوضيح مسارات الرفض ولا يمكن تكرارها مباشرة في بيئة إنتاج. لا يستدعي المثال extractall، ولا يكتب إدخالات ZIP، لذا فهو ليس برنامج إلغاء ضغط آمنًا تمامًا.
تتطلب الإدخالات المشفرة والروابط الرمزية والمحفوظات المتداخلة واستهلاك الموارد للمحلل نفسه سياسات منفصلة.
المراجع: Python zipfile.
امنح المستخدم معلومات قابلة للتنفيذ عند الرفض
يحتاج المستخدمون إلى معرفة ما يجب فعله بعد ذلك عند رفض الملف؛ يجب تسجيل معلومات كافية حول استكشاف الأخطاء وإصلاحها داخليًا. يوضح الجدول التالي طرق المعالجة المقابلة لشروط التشغيل الشائعة:
| حالة الزناد | تعليمات للمستخدمين | السجلات الداخلية |
|---|---|---|
| إجمالي التوسع يتجاوز الميزانية | الملف كبير جدًا عند توسيعه | الحد من الأسماء والملاحظات |
| اسم إدخال مكرر | هيكل الحاوية غير واضح | فهرس الإدخال، النص الكامل غير مسجل |
| طريق خارج الحدود | بنية الملف غير مدعومة | معرف الارتباط بالحوادث الأمنية |
| الحاوية تالفة | الرجاء إعادة تصدير الملف | تحليل نوع الاستثناء |
يجب أن تكون التعليمات المقدمة للمستخدمين موجزة وواضحة لتجنب الكشف عن الكثير من التفاصيل الداخلية؛ يجب أن تحتفظ السجلات الداخلية بالأسماء المقيدة وقيم المراقبة وأنواع الاستثناءات لتسهيل التحقيق اللاحق.
لا تقم بإيقاف تشغيل كافة القيود من أجل التوافق
يمكن أيضًا أن تتجاوز المستندات الكبيرة بشكل معقول ميزانيتك. في هذا الوقت، يعد توفير قائمة انتظار ملفات كبيرة مستقلة أو مدخل معالجة يدوية أكثر أمانًا بدلاً من تخفيف القيود المفروضة على جميع المهام.
إن زيادة حصة الأعمال لمستأجر معين لا تعني السماح بضغط غير محدود لجميع المهام. يجب أن تكون القيود مقترنة بعزل التنفيذ، وليس فقط كتابتها بجوار زر التحميل.
إذا فشلت الترجمة، فأنت بحاجة إلى تحديد الطبقة التي توجد بها.
عند التحضير لإرسال مستند إلى OmniDoc (بوابة المنتج)، قم أولاً بفصل تلف الحاوية عن فشل الترجمة. إذا كان DOCX لا يمكنه حتى قراءة XML، فقد تحدث المشكلة في مرحلة إعداد الإدخال. يتيح تقرير الاختبار المبدئي الواضح للمستخدمين معرفة ما إذا كان يجب عليهم إعادة التصدير أو ضغط الصور أو الاتصال بخدمة الترجمة لاستكشاف الأخطاء وإصلاحها.
📊 المقارنة الأساسية
| التحقق من التوقيت | الوظيفة الرئيسية | القيود |
|---|---|---|
تحقق من جدول الدليل قبل فك الضغط (ZipInfo) | الشاشة المسبقة بناءً على الحجم المعلن وحجم الضغط، ورفض الملفات التي من الواضح أنها تتجاوز الحد الأقصى مقدمًا | تأتي معلومات الإعلان من الملف نفسه ولا تحل محل قيود وقت التشغيل |
| وحدات البايت التراكمية المقروءة أثناء إلغاء الضغط | التعاون مع ميزانية الوقت والذاكرة للتحكم في مقدار التوسع الفعلي | تحتاج إلى مواصلة العد أثناء القراءة |
🎯 ما هي الطريقة المناسبة لك؟
إذا كنت بحاجة إلى تلقي DOCX أو EPUB تم تحميله بواسطة المستخدمين
عند المدخل، تحقق من حجم الضغط وعدد الإدخالات وحجم العنصر الفردي ومبلغ التوسيع الإجمالي في نفس الوقت قبل الدخول في المعالجة اللاحقة.
إذا كنت تعتمد بشكل أساسي على جداول الدليل للتحقق
استخدم جدول الدليل كوسيلة للرفض المبكر، أثناء تجميع وحدات البايت المقروءة أثناء إلغاء الضغط الفعلي، وتحديد ميزانيات الوقت والذاكرة.
إذا كنت تواجه في كثير من الأحيان مستندات كبيرة الحجم إلى حد معقول
قم بتوفير قائمة انتظار ملفات كبيرة منفصلة أو مدخل معالجة يدوية لمثل هذه المستندات، ولا تقم بإيقاف تشغيل كافة القيود من أجل التوافق.
إذا كنت مستعدًا لإرسال مستند إلى OmniDoc
قم أولاً بالتمييز بين تلف الحاوية وفشل الترجمة. يمكن الإبلاغ عن المشكلات التي يمكن اكتشافها أثناء مرحلة ما قبل الفحص للمستخدمين في أقرب وقت ممكن.
❓ الأسئلة الشائعة (الأسئلة الشائعة)
1. هل يمكن استخدام الحجم الموجود في جدول الدليل مباشرة لتحديد ما إذا كان الملف آمنًا؟
لا يمكن الاعتماد عليه بشكل كامل. يعد حجم الإعلان المقدم من ZipInfo مناسبًا للفحص المسبق، ولكن لا يزال من الضروري تجميع وحدات البايت المقروءة وتعيين ميزانية الوقت والذاكرة أثناء إلغاء الضغط الفعلي.
2. لماذا تكون الحزمة المضغوطة صغيرة جدًا وقد تصبح كبيرة جدًا بعد فك الضغط عنها؟
يستخدم كل من DOCX وEPUB ملف ZIP كحاوية. الحجم الصغير للحزمة المضغوطة لا يعني أن الحجم الموسع سيكون صغيرًا أيضًا. لذلك، من الضروري تحديد مقدار التوسع الإجمالي.
3. كيف تتعامل مع المستندات الكبيرة التي تتجاوز الميزانية؟
قد تتجاوز المستندات الكبيرة بشكل معقول الميزانية أيضًا، ويمكن توفير قائمة انتظار ملفات كبيرة منفصلة أو مدخل معالجة يدوية بدلاً من إيقاف تشغيل جميع الحدود.
4. عندما تفشل الترجمة، كيف يمكن تحديد الطبقة التي تكمن فيها المشكلة؟
قم أولاً بالتمييز بين تلف الحاوية وفشل الترجمة. بالنسبة إلى DOCX الذي لا يمكنه حتى قراءة XML، قد تحدث المشكلة في مرحلة إعداد الإدخال. يمكن أن يساعد تقرير الفحص المسبق الواضح المستخدمين على تحديد ما إذا كانوا يريدون إعادة التصدير أو ضغط الصور أو الاتصال بخدمة الترجمة لاستكشاف الأخطاء وإصلاحها.
📝 ملخص
يجب أن يغطي حد إلغاء ضغط ZIP عند الإدخال كلا من الحجم المضغوط وعدد الإدخالات وحجم العنصر الفردي وإجمالي مقدار التوسيع، والتعاون مع الفحص التراكمي في وقت التشغيل. إن إعطاء المستخدم خطوة تالية واضحة عند الرفض يمكن أن يجعل حل المشكلة أسهل.
جربه الآن: قم بتحميل المستند لبدء الترجمة، مع الاحتفاظ بالتخطيط الأصلي


