Avatar billede sbjerre Nybegynder
15. august 2005 - 09:49 Der er 8 kommentarer og
1 løsning

GDI+: Upload af billede fejler

Jeg har en webside hvor man kan uploade nogle billeder der bliver gemt i en SQL server. Alt virker fint, men jeg har villet lave lidt om for nyligt, men er nu stødt på følgende problem:

Når jeg tager fat i den stream der kommer fra websiden til serveren skal stream konverteres til en bytearray, hvilket jeg indtil videre bare har gjort ved at kalde Read() funktionen på streamobjektet like so:

Stream instream = file.PostedFile.InputStream;
int lenght = file.PostedFile.ContentLength;
byte[] b = new byte[lenght];
int testlenght = instream.Read(b, 0, lenght);

Problemet opstod i at jeg ikke kunne loade mit billede senere fra SQL serveren. Nu har jeg så fundet ud af at Read der returnere en int (antal bytes der er blevet læst) ikke læser det hele. Lengt for billedet der uploades er i en test ca. 3,9 MB men når jeg læser testlenght variablen ender den på ca. 2,8 MB!!!
Dette sker selvom lenght er sat til 3,9 og byte[] er initialiseret til samme som lenght og offset er sat til 0.

Jeg fatter det ikke og er derfor åben for alle eventuelle svar.

Mvh Søren
Avatar billede sbjerre Nybegynder
15. august 2005 - 09:49 #1
instream.Lenght er iøvrigt ligeledes 3,9 MB... :)
Avatar billede anadan Nybegynder
15. august 2005 - 10:16 #2
Spørgsmålet hører til i asp.net kategorien, men fandt lige dette link : http://www.codeproject.com/aspnet/fileupload.asp
Avatar billede sbjerre Nybegynder
15. august 2005 - 11:27 #3
Tak for link, men det er desværre overordnet den samme måde jeg har gjort det. Så vidt jeg kan se i hvert fald.
Avatar billede akempff Nybegynder
15. august 2005 - 12:21 #4
Du kan ikke være sikker på at read ikke returnere før den har læst det hele. Det kan du bruge den int den returnere.

F.eks. noget alla det her:

Stream instream = file.PostedFile.InputStream;
int lenght = file.PostedFile.ContentLength;
byte[] b = new byte[lenght];
int rLen = 0;
while(rLen < lenght){
int readLenght = instream.Read(b, 0, lenght);
rLen += readLenght;
}
Avatar billede akempff Nybegynder
15. august 2005 - 12:23 #5
Hov, du skal da i øvrigt lige holde styr på hvad du læser og sætte offset:

int readLenght = instream.Read(b, readLenght, lenght);
Avatar billede akempff Nybegynder
15. august 2005 - 12:25 #6
Lige sidste...sidder og stener;

int readLenght = instream.Read(b, rLen, lenght);
Avatar billede sbjerre Nybegynder
15. august 2005 - 18:51 #7
Udemærket ide. Desværre resulterer det blot i at jeg ender i en uendelig løkke.
Anden gang jeg ryger igennem while løkken læses der nemlig tilsyneladende ingen bytes og jeg kommer derfor aldrig videre.

Det ville jo umiddelbart betyde at der ikke er mere indhold i instream, men ikke desto mindre er ContentLenght ca. 1MB større end det der bliver læst. Det er meget mystisk.

Mvh Søren
Avatar billede akempff Nybegynder
15. august 2005 - 21:04 #8
Nej det er jo ikke optimalt. :)

Prøv at sætte din instream.Position=0 inden du går ind i løkken således at du er sikker på at du starter fra starten af streamen. Det er bare gætværk, men der mangler jo en del bytes et eller andet sted, hvis vi er sikre på at klienten rent faktisk sender det antal bytes som content-lenght siger.
Avatar billede sbjerre Nybegynder
11. oktober 2007 - 08:40 #9
lukket...
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