CF3.5: Ladda ner en fil
Jag försöker ladda ner och spara en fil, men det verkar som att det blir nått fel på vägen, för det jag får ner är inte helt identiskt med det som finns på servern.
Jag använder den här koden:
<code>
Dim WRes As System.Net.WebResponse
Try
WRes = WReq.GetResponse
Catch WebEx As System.Net.WebException
'Felhantering
End Try
Dim S As System.IO.Stream = WRes.GetResponseStream
Dim B(WRes.ContentLength - 1) As Byte
S.Read(B, 0, WRes.ContentLength)
Dim FS As New System.IO.FileStream("fil.exe", IO.FileMode.CreateNew, IO.FileAccess.Write)
FS.Write(B, 0, B.Length)
FS.Close()
S.Close()
</code>
Vad är fel?
/Thomas
Svara
Sv: CF3.5: Ladda ner en fil
Vad menar du med "inte helt identisk"? Om du testar med t.ex. en textfil, blir det någon synbar skillnad då?
/Johan
Svara
Sv: CF3.5: Ladda ner en fil
en gissning är ju antingen encoding problem, alternativt \n vs \r\n radbryt.
Men som sagt, "nåt fel" och "inte helt identiskt" är en något vag felbeskrivning
Svara
Sv:CF3.5: Ladda ner en fil
Med inte helt identisk så menar jag att storleken på filen är rätt, men att den ändå inte går att köra (det är en exe-fil). Testar jag med en textfil så ser den helt korrekt ut.
/Thomas
Svara
Sv:CF3.5: Ladda ner en fil
Genom Process.Start. Men problemet ligger i att filen inte kommer ner rätt. Gör man ett hash-värde av original-filen och den nerladdade så blir värdet inte lika.
/Thomas
Svara
Sv: CF3.5: Ladda ner en fil
Borde väl rimligtvis vara en fråga om att säkerställa att den överförs binärt och inte i text-mode?
Svara
Sv: CF3.5: Ladda ner en fil
Jag gjorde lite justeringar så att filen laddas ner (eller i alla fall läses) i bitar om 1024 bytes och det löste problemet.
<code>
Dim WRes As System.Net.WebResponse
Try
WRes = WReq.GetResponse
Catch WebEx As System.Net.WebException
'Felhantering
End Try
Dim S As System.IO.Stream = WRes.GetResponseStream
Dim B(1024) As Byte
Dim BytesRead As Integer
Dim FS As New System.IO.FileStream("fil.exe", IO.FileMode.CreateNew, IO.FileAccess.Write)
BytesRead = S.Read(B, 0, B.Length)
FS.Write(B, 0, BytesRead)
Do While BytesRead > 0
BytesRead = S.Read(B, 0, B.Length)
FS.Write(B, 0, BytesRead)
Loop
FS.Close()
S.Close()
</code>
/Thomas
Svara