Avatar billede donca Nybegynder
11. november 2005 - 22:41 Der er 30 kommentarer og
1 løsning

Hente fil fra http

Jeg har en fil som mit program skal hente (og ligge i en mappe), jeg har søgt efter nogen eksempler på google.. men det er rimlig svært at putte "download" ind i en søgning... kan nogen hjælpe?
Avatar billede arne_v Ekspert
11. november 2005 - 22:43 #1
check dette eksempel:

  Public Shared Sub Download(url As String)
      Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
      Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
      Dim instm As Stream = resp.GetResponseStream
      Dim fnm As String = resp.Headers("Content-Disposition").Split("""")(1)
      Dim outstm As Stream = New FileStream(fnm, FileMode.CreateNew, FileAccess.Write)
      Dim b(1000) As Byte
      Dim n As Integer
      n = instm.Read(b, 0, b.Length)
      While (n > 0)
          outstm.Write(b, 0, n)
          n = instm.Read(b, 0, b.Length)
      End While
      outstm.Close
      instm.Close
      resp.Close
  End Sub
Avatar billede arne_v Ekspert
11. november 2005 - 22:44 #2
du kan sagtens sende filnavn med hvis det ikke er angivet i HTTP header:

  Public Shared Sub Download(url As String, fnm As String)
      Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
      Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
      Dim instm As Stream = resp.GetResponseStream
      Dim outstm As Stream = New FileStream(fnm, FileMode.CreateNew, FileAccess.Write)
      Dim b(1000) As Byte
      Dim n As Integer
      n = instm.Read(b, 0, b.Length)
      While (n > 0)
          outstm.Write(b, 0, n)
          n = instm.Read(b, 0, b.Length)
      End While
      outstm.Close
      instm.Close
      resp.Close
  End Sub
Avatar billede donca Nybegynder
11. november 2005 - 22:55 #3
nu jeg ikke den store ørn i VB.NET, men jeg skal vist ændre "url" til adressen hvor filen ligger, men hvor gemmer den filen?
Avatar billede arne_v Ekspert
11. november 2005 - 23:00 #4
hvis du bruger den sidste sub og kalder den med URL og filnavn inkl. sti så skulle
det gerne virke
Avatar billede donca Nybegynder
11. november 2005 - 23:03 #5
D:\Documents and Settings\\Dokumenter\Visual Studio Projects\Profession Ricepts\Form1.vb(95): Type 'HttpWebRequest' is not defined.
D:\Documents and Settings\\Dokumenter\Visual Studio Projects\Profession Ricepts\Form1.vb(96): Type 'HttpWebResponse' is not defined.
D:\Documents and Settings\\Dokumenter\Visual Studio Projects\Profession Ricepts\Form1.vb(97): Type 'Stream' is not defined.
D:\Documents and Settings\\Dokumenter\Visual Studio Projects\Profession Ricepts\Form1.vb(98): Type 'Stream' is not defined.
Avatar billede arne_v Ekspert
11. november 2005 - 23:04 #6
du skal importere System.IO og System.Net
Avatar billede donca Nybegynder
11. november 2005 - 23:20 #7
yes det var lige det :)

nu køre den i min Form load, som den funktion...

den køre i en "loadscreen", så jeg skal geren kunne få nogen "status",


som sagt, jeg er ikke lige i ørn i VB.NET, så ville ligespørge om hvordan man kan give en label ny text, fra funtionen?

kan man bare gøre som man normalt gør.. bare inde i funtionen?

samt, hvad variabel holder max Byte og Byte hentet?

mange tak igen
Avatar billede arne_v Ekspert
11. november 2005 - 23:39 #8
dinlabel.Text = "bla bla"

men du får ikke noget fornuftigt ud af at downloade i click eventen og "opdatere"
undervejs
Avatar billede donca Nybegynder
11. november 2005 - 23:50 #9
jeg får denne fejl når jeg skriver

Form1.Text = "bla bla"

D:\Documents and Settings\\Dokumenter\Visual Studio Projects\Profession Ricepts\Form1.vb(98): Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
Avatar billede donca Nybegynder
12. november 2005 - 00:27 #10
undskyld Label1.Text = "Bla Bla"

den giver bare den fejl
Avatar billede bernhof Nybegynder
14. november 2005 - 10:57 #11
Fjern 'Shared' i definitionen af den ovenstående sub, så det ser således ud istedet:

Public Sub Download(url As String, fnm As String)
Avatar billede freegeg Nybegynder
14. november 2005 - 12:59 #12
ok.. mange tak :)
Avatar billede donca Nybegynder
03. december 2005 - 07:10 #13
Jeg har lige kigget lidt dybere på at downloade... når den downloader "fryser" programmet.. indtil den har hentet filen.... kan man lave det om?
Avatar billede donca Nybegynder
03. december 2005 - 07:36 #14
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
    Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
    Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
    Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents overallprogress As System.Windows.Forms.ProgressBar
    Friend WithEvents curprogress As System.Windows.Forms.ProgressBar
    Friend WithEvents overalltextprogress As System.Windows.Forms.Label
    Friend WithEvents curtextprogress As System.Windows.Forms.Label
    Public WithEvents curtextfile As System.Windows.Forms.Label
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.MainMenu1 = New System.Windows.Forms.MainMenu
        Me.MenuItem1 = New System.Windows.Forms.MenuItem
        Me.MenuItem2 = New System.Windows.Forms.MenuItem
        Me.MenuItem3 = New System.Windows.Forms.MenuItem
        Me.Button1 = New System.Windows.Forms.Button
        Me.overallprogress = New System.Windows.Forms.ProgressBar
        Me.curprogress = New System.Windows.Forms.ProgressBar
        Me.overalltextprogress = New System.Windows.Forms.Label
        Me.curtextprogress = New System.Windows.Forms.Label
        Me.curtextfile = New System.Windows.Forms.Label
        Me.SuspendLayout()
        '
        'MainMenu1
        '
        Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})
        '
        'MenuItem1
        '
        Me.MenuItem1.Index = 0
        Me.MenuItem1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem2, Me.MenuItem3})
        Me.MenuItem1.Text = "Config"
        '
        'MenuItem2
        '
        Me.MenuItem2.Index = 0
        Me.MenuItem2.Text = "Internet"
        '
        'MenuItem3
        '
        Me.MenuItem3.Index = 1
        Me.MenuItem3.Text = "Local settings"
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(160, 104)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(104, 23)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Check for updates"
        '
        'overallprogress
        '
        Me.overallprogress.Location = New System.Drawing.Point(8, 80)
        Me.overallprogress.Name = "overallprogress"
        Me.overallprogress.Size = New System.Drawing.Size(256, 16)
        Me.overallprogress.TabIndex = 1
        '
        'curprogress
        '
        Me.curprogress.Location = New System.Drawing.Point(8, 32)
        Me.curprogress.Name = "curprogress"
        Me.curprogress.Size = New System.Drawing.Size(256, 16)
        Me.curprogress.TabIndex = 2
        '
        'overalltextprogress
        '
        Me.overalltextprogress.Location = New System.Drawing.Point(8, 56)
        Me.overalltextprogress.Name = "overalltextprogress"
        Me.overalltextprogress.Size = New System.Drawing.Size(100, 16)
        Me.overalltextprogress.TabIndex = 3
        Me.overalltextprogress.Text = "Overall:"
        '
        'curtextprogress
        '
        Me.curtextprogress.Location = New System.Drawing.Point(8, 8)
        Me.curtextprogress.Name = "curtextprogress"
        Me.curtextprogress.Size = New System.Drawing.Size(100, 16)
        Me.curtextprogress.TabIndex = 4
        Me.curtextprogress.Text = "Current file:"
        '
        'curtextfile
        '
        Me.curtextfile.Location = New System.Drawing.Point(120, 8)
        Me.curtextfile.Name = "curtextfile"
        Me.curtextfile.Size = New System.Drawing.Size(144, 16)
        Me.curtextfile.TabIndex = 5
        Me.curtextfile.Text = "n/a"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(272, 131)
        Me.Controls.Add(Me.curtextfile)
        Me.Controls.Add(Me.curtextprogress)
        Me.Controls.Add(Me.overalltextprogress)
        Me.Controls.Add(Me.curprogress)
        Me.Controls.Add(Me.overallprogress)
        Me.Controls.Add(Me.Button1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
        Me.MaximizeBox = False
        Me.Menu = Me.MainMenu1
        Me.Name = "Form1"
        Me.Text = "WoWup v0.11 [BETA]"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Public Sub Download(ByVal url As String, ByVal fnm As String, ByVal sender As Object, ByVal e As System.EventArgs)
        If File.Exists(fnm) = False Then
            Dim size As Integer = 0
            Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
            Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
            Dim instm As Stream = resp.GetResponseStream
            Dim outstm As Stream = New FileStream(fnm, FileMode.CreateNew, FileAccess.Write)
            Dim b(1000) As Byte
            Dim n As Integer
            n = instm.Read(b, 0, b.Length)
            Me.curtextfile.Text = fnm
            While (n > 0)
                outstm.Write(b, 0, n)
                n = instm.Read(b, 0, b.Length)
            End While
            outstm.Close()
            instm.Close()
            resp.Close()
        End If
        Me.curtextfile.Text = fnm
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim files(1000) As String
        Dim i As Integer = 0
        files(0) = "gtasa.jpg"
        files(1) = "index.html"
        files(2) = "sys.wowdb"

        While (files(i) > "")
            Download("http://localhost/" & files(i), files(i), sender, e)
            i = i + 1
        End While
    End Sub
End Class
Avatar billede arne_v Ekspert
03. december 2005 - 15:54 #15
du skal downloade i en tråd
Avatar billede donca Nybegynder
03. december 2005 - 16:37 #16
piv... du må ikke slå :'(

ehem... hvordan laver jeg en ny tråd?
og hvordan kan jeg arbejde med den?
Avatar billede donca Nybegynder
03. december 2005 - 22:22 #17
Avatar billede donca Nybegynder
03. december 2005 - 22:22 #18
point arne?
Avatar billede arne_v Ekspert
03. december 2005 - 22:56 #19
gerne
Avatar billede donca Nybegynder
08. december 2005 - 19:59 #20
nu har jeg godtnok givet dig point... men giver "n" ikke en max data i byte?

så vis jeg siger  (inde i loopet)

nall = nall + n

vil den lave en max antal data hentet?
Avatar billede arne_v Ekspert
08. december 2005 - 20:07 #21
n er antal byte læst i den enkelte Read

din nall vil komme til at indeholde den totale størrelse
Avatar billede donca Nybegynder
09. december 2005 - 07:24 #22
vis jeg giver dig point i et ny sprøgsmål..vil du så ikke svare mig hvad jeg skal gøre for at får følgende data?


Fil størrelse i Byte (før hentning)
Antal Byte hentet fra fil (under hentning)

har kigget lidt på msdn.. men blev lidt slået ud

ville mene det en nyttig ting at have.. da en XML database let kan fylde 2MByte :)
Avatar billede donca Nybegynder
09. december 2005 - 09:37 #23
n er sikkert også "header data" og andet, ville kun tælle filens hentet Byte..
Avatar billede bernhof Nybegynder
09. december 2005 - 09:51 #24
Nu har jeg ikke selv efterprøvet dette, men du kunne prøve at se, hvad du får ud af at spørge på instm.Length - dette skulle gerne give længden på hele din stream, dvs. størrelsen af filen i bytes. Sådan kan man i hvert fald gøre, når man læser filer fra disk, men det kan godt være, at det ikke fungerer på helt samme måde, når man henter fra nettet.

Under læsning, kan du se, hvor mange bytes du har hentet ved at spørge på instm.Position, såvidt jeg husker.

Håber det kan bruges.
Avatar billede donca Nybegynder
09. december 2005 - 10:05 #25
jeg får fejl ved bægge

Position og Lenght :/
Avatar billede bernhof Nybegynder
09. december 2005 - 10:06 #26
Hvilken fejl?
Avatar billede donca Nybegynder
09. december 2005 - 10:12 #27
System.NotSupportedException

Additional info: This stram does not support seek operations
Avatar billede donca Nybegynder
09. december 2005 - 10:34 #28
ahh.. man skulle tage den direkte fra HttpWebResponse med ContentLenght.. siden den har alle header infoen
Avatar billede bernhof Nybegynder
09. december 2005 - 10:40 #29
Ok. For at finde ud af hvor meget du har downloadet, kan du, som jeg kan se du har overvejet tidligere, bare tælle sammen hele tiden ud fra din n variabel, men du kan også bare spørge på enten Position eller Length på din outstm stream. (måske giver begge det samme tal).
Avatar billede donca Nybegynder
09. december 2005 - 10:43 #30
fik min download bar til at virke nu :)

vil du have lidt point for din hjælp? så kan jeg lige oprette en tråd?
Avatar billede bernhof Nybegynder
12. december 2005 - 09:23 #31
nej tak, det behøver du ikke :)
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
Kurser inden for grundlæggende programmering

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