[.NET] Downloaden van webplaatjes

Pagina: 1
Acties:

  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
Ik probeer via .NET een webplaatje te downloaden naar de lokale harddisk. Nu gaat dit met onderstaande functie best goed, alleen dat byte voor byte uitlezen en schrijven in de BinaryWriter is zo f*cking traag! :'( Weet iemand een snellere manier? Ik krijg er geen gevonden...
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Public Function DownloadImage(ByVal strUrl As String, ByVal strStorePath As String) As Boolean
        Dim objWebRequest As Net.HttpWebRequest
        Dim objWebResponse As Net.HttpWebResponse
        Dim objResponseStream As System.IO.Stream
        Dim objBinaryReader As BinaryReader
        Dim objFile As File
        Dim blnError As Boolean = False

        Try
            objWebRequest = objWebRequest.Create(strUrl)
            objWebResponse = objWebRequest.GetResponse()
            objResponseStream = objWebResponse.GetResponseStream()
            objBinaryReader = New BinaryReader(objResponseStream)
            Dim objFileStream As New FileStream(strStorePath, FileMode.CreateNew)
            Dim objBinaryWriter As New BinaryWriter(objFileStream)
            Try
                While True
                    objBinaryWriter.Write(CByte(objBinaryReader.BaseStream.ReadByte))
                End While
            Catch
            End Try
            objBinaryWriter.Close()
            objFileStream.Close()
        Catch
            blnError = True
        End Try
        Return blnError
End Function

Dat is niet gênant, dat is professioneel.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Niet geheel verassend heb je ook readbytes naast readbyte.
Zie msdn:
http://msdn.microsoft.com...erclassreadbytestopic.asp

Who is John Galt?


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
justmental schreef op 04 August 2003 @ 17:02:
Niet geheel verassend heb je ook readbytes naast readbyte.
Zie msdn:
http://msdn.microsoft.com...erclassreadbytestopic.asp
Ja, die is best leuk, moet je alleen wel bij opgeven hoeveel Bytes hij moet lezen. Dus eigenlijk met objBinaryReader.BaseStream.Length.
Dus:
Visual Basic:
1
objBinaryWriter.Write(objBinaryReader.ReadBytes(objBinaryReader.BaseStream.Length))

alleen kan een een BinaryReader weer niet seeken en krijg je de error "This stream does not support seek operations."

Dat is niet gênant, dat is professioneel.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Hier staat wanneer je welke functies moet gebruiken:
http://msdn.microsoft.com...html/cpconbasicfileio.asp

Als ik het goed begrijp moet je dus gaan lezen met bufferedstream.read:
http://msdn.microsoft.com...feredStreamClassTopic.asp

Who is John Galt?


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
justmental schreef op 04 augustus 2003 @ 17:18:
Hier staat wanneer je welke functies moet gebruiken:
http://msdn.microsoft.com...html/cpconbasicfileio.asp

Als ik het goed begrijp moet je dus gaan lezen met bufferedstream.read:
http://msdn.microsoft.com...feredStreamClassTopic.asp
Ja, en daar waggel ik weer tegen hetzelfde probleem op, bij de read functie moet je opgeven hoeveel bytes hij moet lezen, objBufferedStream.Length dus, alleen dan krijg je weer de error dat hij niet kan seeken.
Ik wordt gek van de streams :(

Dat is niet gênant, dat is professioneel.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je kunt er gewoon een vast getal in gooien, hij geeft dan gewoon alles terug tot het einde of dat getal.
Dat kun je dan weer in een loop gooien als dat nodig is.

Who is John Galt?


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Sowieso kan je eens kijken naar het Proxy Design Pattern en het downloaden door een andere thread laten afhandelen.

Verder moet ik je zeggen dat ik me afvraag waarom je try - catch - end try statements gebruikt. Zoals jij die dingen mishandeld, kan je net zo goed On Error Resume Next gebruiken.

[ Voor 53% gewijzigd door gorgi_19 op 04-08-2003 18:13 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
gorgi_19 schreef op 04 August 2003 @ 18:05:
Sowieso kan je eens kijken naar het Proxy Design Pattern en het downloaden door een andere thread laten afhandelen.

Verder moet ik je zeggen dat ik me afvraag waarom je try - catch - end try statements gebruikt. Zoals jij die dingen mishandeld, kan je net zo goed On Error Resume Next gebruiken.
Ja, dat try catch is natuurlijk heel smerig gebruikt *schaam schaam* ;) Maar het probleem was dat tijdens het uitlezen van de stream, hij niet kon zien wanneer hij aan het eind was en er dus maar mooi met een exception uitfloepte. Even zo opgelost.. werkte ook nog :)

Zal morgen (is voor mijn werk) eens naar Proxy Design Pattern kijken.

Dat is niet gênant, dat is professioneel.


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
justmental schreef op 04 August 2003 @ 17:34:
Je kunt er gewoon een vast getal in gooien, hij geeft dan gewoon alles terug tot het einde of dat getal.
Dat kun je dan weer in een loop gooien als dat nodig is.
Jupz... alleen weet je dan niet hoe groot je array moet zijn, aangezien .read een array van byte's teruggeeft.

Dat is niet gênant, dat is professioneel.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Wallie schreef op 04 August 2003 @ 20:51:
[...]

Jupz... alleen weet je dan niet hoe groot je array moet zijn, aangezien .read een array van byte's teruggeeft.
Ubound() :?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
De .read functie geeft de Array van bytes terug via de parameter lijst (ByRef)... Je weet dus niet hoeveel eruit komt. Dit zou je kunnen weten via die .Length property, maar die is weer niet te gebruiken (This stream does not support seek operations)

[ Voor 7% gewijzigd door Wallie op 04-08-2003 20:56 ]

Dat is niet gênant, dat is professioneel.


  • Wallie
  • Registratie: Januari 2000
  • Laatst online: 14:46
Goed, nieuwe oplossing:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    Public Function DownloadImage(ByVal strUrl As String, ByVal strStorePath As String) As Boolean
        Dim objWebRequest As Net.HttpWebRequest
        Dim objWebResponse As Net.HttpWebResponse
        Dim objResponseStream As System.IO.Stream
        Dim objBufferedStream As BufferedStream
        Dim objBinaryReader As BinaryReader
        Dim objFile As File
        Dim blnError As Boolean = False
        Dim intI As Integer

        objWebRequest = objWebRequest.Create(strUrl)
        objWebResponse = objWebRequest.GetResponse()
        objResponseStream = objWebResponse.GetResponseStream()
        objBinaryReader = New BinaryReader(objResponseStream)
        Dim objFileStream As New FileStream(strStorePath, FileMode.CreateNew)
        Dim objBinaryWriter As New BinaryWriter(objFileStream)
        Dim arrByte() As Byte
        For intI = 0 To 100000 Step 10000
            ReDim arrByte(10000)
            arrByte = objBinaryReader.ReadBytes(10000)
            objBinaryWriter.Write(arrByte)
        Next
        objBinaryWriter.Close()
        objFileStream.Close()
        blnError = True
        Return blnError
    End Function

Werkt veel sneller, alleen leest hij nu maar de eerste 100000 bytes uit. Opzich geen probleem voor waar ik het voor wil gebruiken (plaatjes van max 60kb), maar is er geen manier waarop je kan zien hoeveel bytes er nou eigenlijk in die BinaryReader zitten zodat je weer weet hoever je moet lezen? BinaryReader.BaseStream.Length werkt dus niet (hij kan niet seeken)

Dat is niet gênant, dat is professioneel.

Pagina: 1