Avatar billede burningice Nybegynder
17. november 2003 - 16:57 Der er 7 kommentarer og
1 løsning

Problemer med SharpZipLib

Nogen der har erfaring med at bruge dette libary fra ic# ?

Jeg har nogle problemer med at læse alle billederne ud af en zip-fil. Jeg har en form hvor man enten kan uploade et enkelt jpg-billede eller en zip-fil med jpg-billeder.

Til at pakke mine billeder ud bruger jeg følgende kode, som kalder en SavePicture()-metode som tager et byte[] som input.

                ZipInputStream zipStream = new ZipInputStream(file.InputStream);
               
                ZipEntry zipEntry;

                while ((zipEntry = zipStream.GetNextEntry()) != null)
                {
                    byte[] data = new byte[zipEntry.Size];
                   
                    zipStream.Read(data, zipEntry.offset, data.Length);
                   
                    SavePicture(data);
                }

SavePiture() laver så en memorystream, derefter et Bitmap og derefter noget billedmanipulation hvor de til sidst gemmes.
Når jeg bare uploader et enkelt billede virker det hele super-duper, men ved upload af en zip-fil går det galt. Får en Exception på min Bitmap-constructor hvilket tyder på at der er korrupte data i min byte[]-buffer.

Nogen der kan se fejl i min kode, og evt. har en løsning på hvordan det ellers gøres?
Avatar billede odegaard Nybegynder
17. november 2003 - 18:54 #1
Prøv at kigge i ZipTestSuite der følger med sourcekoden. Dér gøres det således:

ZipInputStream inStream = new ZipInputStream(ms);
byte[] buf2 = new byte[buf.Length];
int    pos  = 0;
ZipEntry entry2 = inStream.GetNextEntry();
while (true) {
    int numRead = inStream.Read(buf2, pos, 4096);
    if (numRead <= 0) {
        break;
    }
    pos += numRead;
}
Avatar billede odegaard Nybegynder
17. november 2003 - 18:59 #2
Ah jeg tror jeg har gennemskuet den. Kan det tænkes at du ikke får læst den rigtige længde data ind i data-bufferen ?
Ovenstående eksempel læse sig jo frem i ryk, indtil hele filen er læst. Dvs. jeg kunne forestille mig at denne løkke skal køres for hver fil.

Men det er kun gætterier. Jeg er zipper kun enkelte filer, som jeg gemmer i min database og sender dem retur igen (mangler stadig at implementere udpakning).
Avatar billede burningice Nybegynder
17. november 2003 - 19:28 #3
hm.. det kan godt være du har ret... lader til at de har en lidt mærkelig implementering af de forskellige properties, og det gør det ikke nemmere at det ikke er særlig fedt dokumenteret.

Well, jeg har nu følgende kode, men det blev desværre ikke meget bedre :(

while ((zipEntry = zipStream.GetNextEntry()) != null)
                {
                    int size = 2048;
                    byte[] data = new byte[size];

                    MemoryStream ms = new MemoryStream();

                    while (true)
                    {
                        size = zipStream.Read(data, 0, data.Length);

                        if (size > 0)
                        {
                            ms.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }

                    byte[] b = new byte[ms.Length];
                    ms.Write(b, 0, b.Length);
                   
                    SavePicture(b);
                }
Avatar billede burningice Nybegynder
17. november 2003 - 19:34 #4
Okay... nu har jeg testet lidt hvad der egentlig står i den data-buffer. Det lader til at den er fyldt med 0'er når jeg uploader en zip-fil, mens hvis det er et normalt billede, så står der en masse tal, som åbenbart bliver til et billede :)

Koden til normalt billede:


Stream s = file.InputStream;

                byte[] b = new byte[s.Length];
                s.Read(b, 0, b.Length);

Så er det bare lige hvad, hvor og hvorfor det går galt :/
Avatar billede burningice Nybegynder
17. november 2003 - 23:54 #5
hm.. så fik jeg det sq til at virke.. ikke fordi at jeg lige kan se hvad forskellen er, men problemet lå åbenbart i der hvor jeg kopierede min MemoryStream tilbage til et byte[]. Jeg prøvede at bruge den indbyggede ToArray()-metode, og sørme om det ikke hjalp :)

Her er koden, og det virker bare

                ZipInputStream zipStream = new ZipInputStream(file.InputStream);
               
                ZipEntry zipEntry;

                while ((zipEntry = zipStream.GetNextEntry()) != null)
                {
                    int size = 2048;
                    byte[] data = new byte[size];

                    MemoryStream ms = new MemoryStream();

                    while (true)
                    {
                        size = zipStream.Read(data, 0, data.Length);

                        if (size > 0)
                        {
                            ms.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }

                    byte[] b = ms.ToArray();
                                       
                    SavePicture(b);
Avatar billede burningice Nybegynder
17. november 2003 - 23:56 #6
der er lidt point til dig for at slå mig oven i hovedet og tvinge mig til at læse noget af det medfølgende kode ;)
Avatar billede odegaard Nybegynder
18. november 2003 - 00:26 #7
behold du dem bare. Jeg kan faktisk bruge lidt af dit kode, da jeg også skal til at køre data den anden vej, så lad os bare kalde os kvit :-)
Avatar billede burningice Nybegynder
18. november 2003 - 10:58 #8
for fanden... nu kan jeg da godt se fejlen.. jeg habde skrevet

ms.Write(b, 0, b.Length);

istedet for

ms.Read(b, 0, b.Length);'

tsk tsk... hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester