Re: Dateidownload per WebRequest (async)
- From: "Herfried K. Wagner [MVP]" <hirf-spam-me-here@xxxxxx>
- Date: Sun, 25 Nov 2007 03:17:56 +0100
Hallo Chuck!
"Chuck Vance" <nomail@invalid> schrieb:
wenn ich auf einer WebSeite einen Link mit
href=www.xyz.de/download?doc0001
(man beachte das Fragezeichen zum Trennen/Übergeben der Parameter)
klicke, öffnet sich der Dateidownload-Dialog des Browsers.
Nun frage ich mich, wie man (z.B. mit WebRequest) diesen Vorgang
aus einem Programnm heraus steuern kann um dann die Datei per Stream
irgendwo hin abzuspeichern.
Hauptproblematik ist dabei, einen passenden Dateinamen zu finden. Mögliche Ansatzpunkte:
* 'Content-Disposition'-Kopfeintrag der vom Server
gesendeten Antwort.
* 'Content-Type' zur Bestimmung der Dateinamenserweiterung
über die MIME-Tabelle des Windows-Systems.
* URI-Segmente (Dateiname, Verzeichnisname, Hostname,
evtl. auch Anfragezeichenfolge).
Folgender Code lädt eine durch einen URI bezeichnete Ressource in eine Datei herunter. Der Dateiname wird dabei wie folgt bestimmt:
* Ist der Parameter 'PreferContentDisposition' gesetzt, wird ein
allfällig vorhandener 'Content-Disposition'-Kopfeintrag hinsichtlich
des Vorhandenseins eines 'filename'-Parameters untersucht und
ggf. dessen Wert als Dateiname herangezogen. Achtung: Hier müßte
man noch eine Plausibilitätsprüfung implementieren.
* Falls 'PreferContentDisposition' nicht gesetzt ist oder kein
entsprechender Eintrag im Antwortkopf vorhanden war, wird
der Datei-, Verzeichnis- oder Hostname aus dem URI zur
Benennung herangezogen. Als Dateinamenserweiterung wird
dabei die zur 'Content-Type'-Angabe passende Erweiterung
aus der MIME-Tabelle verwendet.
Ungetestet und schnell heruntergeschrieben:
\\\
Option Strict On
Option Explicit On
Imports Microsoft.Win32
Imports System.IO
Imports System.Net
Friend Module Module1
Public Function DownloadFile( _
ByVal Uri As String, _
ByVal DestinationDirectory As String, _
Optional ByVal PreferContentDisposition As Boolean = False _
) As String
Dim Request As HttpWebRequest = _
DirectCast(WebRequest.Create(Uri), HttpWebRequest)
Dim Response As WebResponse = Request.GetResponse()
Dim ResponseStream As Stream = Response.GetResponseStream()
Dim FileName As String = Nothing
If PreferContentDisposition Then
Dim ContentDisposition As String = _
Response.Headers("Content-Disposition")
If ContentDisposition IsNot Nothing Then
Dim Parts() As String = Split(ContentDisposition, ";")
If Parts.Length > 0 Then
For i As Integer = 1 To Parts.Length
Dim DispositionParam As String = Parts(i)
Dim ParamParts() As String = _
Split(DispositionParam, "=")
Dim Param As String = ParamParts(0)
Dim ParamValue As String = ParamParts(1)
If Param Is "filename" Then
FileName = Path.GetFileName(ParamValue)
End If
Next i
End If
End If
End If
If FileName Is Nothing Then
Dim FileUri As New Uri(Uri)
FileName = _
Replace( _
FileUri.Segments(FileUri.Segments.Length - 1), _
"/", _
String.Empty _
)
FileName = Path.GetFileNameWithoutExtension(FileName)
If Len(FileName) = 0 Then
FileName = Replace(FileUri.Host, ".", "_")
End If
Dim Key As RegistryKey = _
Registry.ClassesRoot.OpenSubKey( _
"MIME\Database\Content Type\" & Response.ContentType _
)
If Key IsNot Nothing Then
Dim Extension As String = _
DirectCast(Key.GetValue("Extension"), String)
If Extension IsNot Nothing Then
FileName = FileName & Extension
End If
End If
End If
FileName = Path.Combine(DestinationDirectory, FileName)
' Download data and write file.
Using Reader As New BinaryReader(ResponseStream)
Using Writer As New BinaryWriter( _
New FileStream(FileName, FileMode.CreateNew) _
)
' Read blocks of 2,048 bytes.
Const BlockSize As Integer = 2048
Dim Buffer() As Byte
Do
Buffer = Reader.ReadBytes(BlockSize)
Writer.Write(Buffer)
Loop While Buffer.Length > 0
End Using
End Using
Response.Close()
Return FileName
End Function
Public Sub Main()
Console.WriteLine( _
DownloadFile( _
<URI>, _
Environment.GetFolderPath(Environment.SpecialFolder.Desktop) _
) _
)
End Sub
End Module
///
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
.
- References:
- Dateidownload per WebRequest (async)
- From: Chuck Vance
- Dateidownload per WebRequest (async)
- Prev by Date: Re: StringCollection
- Next by Date: Re: Datei mittels OpenTextFileWriter überschreiben?
- Previous by thread: Re: Dateidownload per WebRequest (async)
- Next by thread: Zeilenfarbe im DataGridView
- Index(es):
Relevant Pages
|