خطأ في Windows Azure عند تحميل ملف zip: "ZipException لم يتم تسخينه" "EOF in Header"

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

  •  23-09-2019
  •  | 
  •  

سؤال

لقد كنت أستخدم Windows Azure لإنشاء نظام لإدارة المستندات ، وقد سارت الأمور على ما يرام حتى الآن. لقد تمكنت من تحميل الملفات وتنزيلها على تخزين Blob من خلال واجهة ASP.NET الأمامية.

ما أحاول القيام به الآن هو السماح للمستخدمين بتحميل ملف .zip ، ثم إخراج الملفات من ذلك .zip وحفظهم كملفات فردية. المشكلة هي أنني أحصل على "zipexception لم يكن" "EOF in Header" ولا أعرف السبب.

أنا أستخدم مكتبة icsharpcode.sharpziplib التي استخدمتها في العديد من المهام الأخرى وعملت بشكل رائع.

هذا هو الرمز الأساسي:

CloudBlob ZipFile = container.GetBlobReference(blobURI);
MemoryStream MemStream = new MemoryStream();
ZipFile.DownloadToStream(MemStream);
....
while ((theEntry = zipInput.GetNextEntry()) != null)

وهو على السطر يبدأ أثناء الحصول على الخطأ. أضفت مدة نوم من 10 ثوان فقط للتأكد من أن الوقت قد مرت.

لدى Memstream طوله إذا قمت بتصحيحه ، لكن Zipinput يفعل أحيانًا ، ولكن ليس دائمًا. يفشل دائما.

هل كانت مفيدة؟

المحلول

مجرد تخمين عشوائي ، ولكن هل تحتاج إلى البحث عن الدفق إلى 0 قبل قراءته؟ لست متأكدًا مما إذا كنت تفعل ذلك بالفعل (أو إذا كان ذلك ضروريًا).

نصائح أخرى

smarx تلميح فعلت الخدعة بالنسبة لي أيضا. مفتاح تجنب الملفات الفارغة داخل الرمز البريدي هو تعيين الموضع على الصفر. من أجل الوضوح هنا هو رمز العينة الذي يرسل بثمن سحاب يحتوي على نقطة Azure إلى المتصفح.

        var fs1 = new MemoryStream();
        Container.GetBlobReference(blobUri).DownloadToStream(fs1);
        fs1.Position = 0;

        var outputMemStream = new MemoryStream();
        var zipStream = new ZipOutputStream(outputMemStream);

        var entry1 = new ZipEntry(fileName);
        zipStream.PutNextEntry(entry1);
        StreamUtils.Copy(fs1, zipStream, new byte[4096]);
        zipStream.CloseEntry();

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + zipFileName);
        Response.OutputStream.Write(outputMemStream.ToArray(), 0, outputMemStream.ToArray().Length);
        Response.End();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top