File: Microsoft\VisualBasic\Devices\Network.UploadFile.vb
Web Access
Project: src\src\Microsoft.VisualBasic.Forms\src\Microsoft.VisualBasic.Forms.vbproj (Microsoft.VisualBasic.Forms)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
 
Imports System.Net
Imports Microsoft.VisualBasic.CompilerServices
Imports Microsoft.VisualBasic.FileIO
Imports Microsoft.VisualBasic.MyServices.Internal
 
Namespace Microsoft.VisualBasic.Devices
 
    Partial Public Class Network
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">The full name and path of the host destination.</param>
        Public Sub UploadFile(sourceFileName As String, address As String)
            UploadFile(
                sourceFileName,
                address,
                userName:=DEFAULT_USERNAME,
                password:=DEFAULT_PASSWORD,
                showUI:=False,
                connectionTimeout:=DEFAULT_TIMEOUT)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        Public Sub UploadFile(sourceFileName As String, address As Uri)
            UploadFile(
                sourceFileName,
                address,
                userName:=DEFAULT_USERNAME,
                password:=DEFAULT_PASSWORD,
                showUI:=False,
                connectionTimeout:=DEFAULT_TIMEOUT)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">The full name and path of the host destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="password">The user's password.</param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As String,
            userName As String,
            password As String)
 
            UploadFile(
                sourceFileName,
                address,
                userName,
                password,
                showUI:=False,
                connectionTimeout:=DEFAULT_TIMEOUT)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="password">The user's password.</param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As Uri,
            userName As String,
            password As String)
 
            UploadFile(
                sourceFileName,
                address,
                userName,
                password,
                showUI:=False,
                connectionTimeout:=DEFAULT_TIMEOUT)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">The full name and path of the host destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="Password">The user's password.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As String,
            userName As String,
            password As String,
            showUI As Boolean,
            connectionTimeout As Integer)
 
            UploadFile(
                sourceFileName,
                address,
                userName,
                password,
                showUI,
                connectionTimeout,
                onUserCancel:=UICancelOption.ThrowException)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">The full name and path of the host destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="Password">The user's password.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        ''' <param name="onUserCancel">
        '''  Indicates what to do if user cancels dialog (either throw or do nothing).
        ''' </param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As String,
            userName As String,
            password As String,
            showUI As Boolean,
            connectionTimeout As Integer,
            onUserCancel As UICancelOption)
 
            ' We're safe from UploadFile(Nothing, ...) due to overload failure (UploadFile(String,...)
            ' vs. UploadFile(Uri,...)).
            ' However, it is good practice to verify address before calling address.Trim.
            If String.IsNullOrWhiteSpace(address) Then
                Throw GetArgumentNullException(NameOf(address))
            End If
 
            ' Getting a uri will validate the form of the host address
            Dim addressUri As Uri = GetUri(address.Trim())
 
            ' For uploads, we need to make sure the address includes the filename
            If String.IsNullOrEmpty(IO.Path.GetFileName(addressUri.AbsolutePath)) Then
                Throw GetInvalidOperationException(SR.Network_UploadAddressNeedsFilename)
            End If
 
            UploadFile(
                sourceFileName,
                address:=addressUri,
                userName,
                password,
                showUI,
                connectionTimeout,
                onUserCancel)
 
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="password">The user's password.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As Uri,
            userName As String,
            password As String,
            showUI As Boolean,
            connectionTimeout As Integer)
 
            UploadFile(
                sourceFileName,
                address,
                userName,
                password,
                showUI,
                connectionTimeout,
                onUserCancel:=UICancelOption.ThrowException)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        ''' <param name="userName">The name of the user performing the upload.</param>
        ''' <param name="password">The user's password.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        ''' <param name="onUserCancel">
        '''  Indicates what to do if user cancels dialog (either throw or do nothing).
        ''' </param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As Uri,
            userName As String,
            password As String,
            showUI As Boolean,
            connectionTimeout As Integer,
            onUserCancel As UICancelOption)
 
            ' Get network credentials
            Dim networkCredentials As ICredentials = GetNetworkCredentials(userName, password)
 
            UploadFile(
                sourceFileName,
                address,
                networkCredentials,
                showUI,
                connectionTimeout,
                onUserCancel)
 
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        ''' <param name="networkCredentials">The credentials of the user performing the upload.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As Uri,
            networkCredentials As ICredentials,
            showUI As Boolean,
            connectionTimeout As Integer)
 
            UploadFile(
                sourceFileName,
                address,
                networkCredentials,
                showUI,
                connectionTimeout,
                onUserCancel:=UICancelOption.ThrowException)
        End Sub
 
        ''' <summary>
        '''  Uploads a file from the local machine to the specified host.
        ''' </summary>
        ''' <param name="sourceFileName">The file to be uploaded.</param>
        ''' <param name="address">Uri representing the destination.</param>
        ''' <param name="networkCredentials">The credentials of the user performing the upload.</param>
        ''' <param name="showUI">Indicates whether or not to show a progress bar.</param>
        ''' <param name="connectionTimeout">Time allotted before giving up on a connection.</param>
        ''' <param name="onUserCancel">
        '''  Indicates what to do if user cancels dialog (either throw or do nothing).
        ''' </param>
        Public Sub UploadFile(
            sourceFileName As String,
            address As Uri,
            networkCredentials As ICredentials,
            showUI As Boolean,
            connectionTimeout As Integer,
            onUserCancel As UICancelOption)
 
            sourceFileName = FileSystemUtils.NormalizeFilePath(sourceFileName, NameOf(sourceFileName))
 
            'Make sure the file exists
            If Not IO.File.Exists(sourceFileName) Then
                Dim message As String = GetResourceString(SR.IO_FileNotFound_Path, sourceFileName)
                Throw New IO.FileNotFoundException(message)
            End If
 
            If connectionTimeout <= 0 Then
                Throw GetArgumentExceptionWithArgName(
                    argumentName:=NameOf(connectionTimeout),
                    resourceKey:=SR.Network_BadConnectionTimeout)
            End If
 
            If address Is Nothing Then
                Throw GetArgumentNullException(NameOf(address))
            End If
 
            Using client As New WebClientExtended()
                client.Timeout = connectionTimeout
 
                ' Set credentials if we have any
                If networkCredentials IsNot Nothing Then
                    client.Credentials = networkCredentials
                End If
 
                Dim dialog As ProgressDialog = Nothing
                If showUI AndAlso Environment.UserInteractive Then
                    dialog = New ProgressDialog With {
                        .Text = GetResourceString(SR.ProgressDialogUploadingTitle, sourceFileName),
                        .LabelText = GetResourceString(
                            resourceKey:=SR.ProgressDialogUploadingLabel,
                            sourceFileName,
                        address.AbsolutePath)
                    }
                End If
 
                'Create the copier
                Dim copier As New WebClientCopy(client, dialog)
 
                'Download the file
                copier.UploadFile(sourceFileName, address)
 
                'Handle a dialog cancel
                If showUI AndAlso Environment.UserInteractive Then
                    If onUserCancel = UICancelOption.ThrowException And dialog.UserCanceledTheDialog Then
                        Throw New OperationCanceledException()
                    End If
                End If
            End Using
 
        End Sub
 
    End Class
End Namespace