Avatar billede montago Praktikant
08. oktober 2007 - 11:31 Der er 5 kommentarer og
1 løsning

Hente remote fil med WebRequest og send den til Klient

Jeg er istand til at hente websider og vise dem korrekt på en portal side.

nu vil jeg så igang med at hente filer remote, og sende disse til klienten - det hele igennem portalen.

Jeg opretter et WeRequest objekt som henter filen:

// C# - Hent fil
WebRequest objWebRequest = WebRequest.Create(objURI);
WebResponse objWebResponse = objWebRequest.GetResponse();
Stream objStream = objWebResponse.GetResponseStream();
StreamReader objStreamReader = new StreamReader(objStream);
if (objWebResponse.ContentType.Contains("text/"))
{
  ...
}
else //file
{
  Stream ResponseReader = objWebResponse.GetResponseStream();
  gadget.BinaryFile = new byte[(int)objWebResponse.ContentLength]; //Clear'n'Prepare buffer
  ResponseReader.Read(gadget.BinaryFile, 0, (int)objWebResponse.ContentLength);
  gadget.FileContentType = objWebResponse.ContentType;
  gadget.FileName = (new Uri(strURI).Segments)[(new Uri(strURI).Segments).Length - 1];
}

Herefter vil jeg i Page_Load sende filen til brugeren:

//C# -- Send fil
  Response.Clear();
  Response.AddHeader("Content-Disposition", "filename=" + GadgetList[GadgetList.HasFile()].FileName);
  Response.AddHeader("Content-Length", GadgetList[GadgetList.HasFile()].BinaryFile.Length.ToString());
  Response.ContentType = GadgetList[GadgetList.HasFile()].FileContentType;
  Response.BinaryWrite(GadgetList[GadgetList.HasFile()].BinaryFile);

  Response.End();


------

GadgetList er en Indexer af Gadgets, som kan hente en Gadget ud af en List.

en Gadget indeholder bl.a. de public properties:
string FileName,
char[] BinaryFile og
string ContentType

som er hhv. min buffer og dennes egenskaber.


Mit problem er at filen kun er fyldt med data i staten, resten er 0x00'er dvs. de første cirka 50 KB indeholder data...

hvad gør jeg galt =
Avatar billede montago Praktikant
08. oktober 2007 - 12:00 #1
Jeg har leget lidt med at bruge en do{}while til at læse buffered ind i min byte[] ... men klienten modtager stadig væk kun en fil med nogle kb header og en masse nulls !
Avatar billede montago Praktikant
08. oktober 2007 - 14:05 #2
gadget.FileContentType = objWebResponse.ContentType;
Stream ResponseReader = objWebResponse.GetResponseStream();
gadget.BinaryFile = new byte[(int)objWebResponse.ContentLength]; //Clear'n'Prepare buffer

int bytesread = 0, processed = 0, length = (int)objWebResponse.ContentLength;
do{
  if (length - processed > 1024)
    bytesread = ResponseReader.Read(gadget.BinaryFile, processed, 1024);
  else
    bytesread = ResponseReader.Read(gadget.BinaryFile, processed, length - processed);
  processed += bytesread;
}while(length > processed);

^--- virker heller ik :(... den hænger bare !
Avatar billede arne_v Ekspert
08. oktober 2007 - 18:20 #3
Du skal bruge en løkke.

En Read læser de data der er modtaget - den venter ikke på "alle" data.

Normalt er:

byte[] buf = new byte[bufsiz];
int ix = 0;
int n;
while((n = stm.Read(buf, ix, bufsiz - ix)) > 0)
{
    ix += n;
}

men du skal nok bruge:

byte[] buf = new byte[bufsiz];
int ix = 0;
int n;
while(ix < bufsiz)
{
    n = stm.Read(buf, ix, bufsiz - ix);
    ix += n;
}
Avatar billede montago Praktikant
08. oktober 2007 - 20:33 #4
dvs... i eksempel 2...

jeg skal altså hele tiden prøve at læse resten af bufferlængden...
mystisk...

men der giver jo mening :)

prøver lige
Avatar billede montago Praktikant
16. oktober 2007 - 10:41 #5
hvornår lære folk at smide et svar NÅR de svare...

måske hvis man utaknemmeligt snupper sine point til sig selv...

jeg ved det ik - Eksperten sux

Arne... din løsning virker
Avatar billede arne_v Ekspert
16. oktober 2007 - 15:03 #6
et svar kommer her
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