17. november 2003 - 16:57Der 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];
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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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).
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);
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 :/
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);
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
Synes godt om
Ny brugerNybegynder
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.