# encoding: ascii
# api: powershell
# title: Send-FTP
# description: A little Send-FTP script to support uploading files. This version is simple: it can’t create folders nor allow you to specify whether to overwrite files …
# version: 1.0
# type: function
# author: Joel Bennett
# license: CC0
# function: Send-FTP
# x-poshcode-id: 1240
# x-archived: 2014-01-05T02:58:46
# x-published: 2010-07-28T21:22:00
#
#
function Send-FTP {
Param(
$Server = "ilncenter.net"
, $Credentials = $(Get-Credential)
, [Parameter(ValueFromPipeline=$true)]
$LocalFile
, $Path = "/"
, $RemoteFile = $(Split-Path $LocalFile -Leaf)
, $ParentProgressId = -1 ## Just ignore this ;)
, $ProgressActivity = "Uploading $LocalFile"
)
Process {
## Assert the existence of the file in question
if( -not (Test-Path $LocalFile) ) {
Throw "File '$LocalFile' does not exist!"
}
## Create the server string (and make sure it uses forward slashes and ftp://)
$upload = "ftp://" + $Server + ( Join-Path (Join-Path "/" $Path) $RemoteFile ) -replace "\\", "/"
#$Upload = $upload
$total = (gci $LocalFile).Length
Write-Debug $upload
## Create FTP request
$request = [Net.FtpWebRequest]::Create($upload)
## NOTE: we do not create a folder here...
# [System.Net.WebRequestMethods+Ftp]::MakeDirectory
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$request.Credentials = $Credentials.GetNetworkCredential()
$request.UsePassive = $true
$request.UseBinary = $true
$request.KeepAlive = $false
try {
## Load the file
$read = [IO.File]::OpenRead( (Convert-Path $LocalFile) )
$write = $request.GetRequestStream();
$buffer = new-object byte[] 20KB
$offset = 0
$progress = 0
do {
$offset = $read.Read($buffer, 0, $buffer.Length)
$progress += $offset
$write.Write($buffer, 0, $offset);
Write-Progress $ProgressActivity "Uploading" -Percent ([int]($progress/$total * 100)) -Parent $ParentProgressId
} while($offset -gt 0)
} finally {
Write-Debug "Closing Handles"
$read.Close()
$write.Close()
}
}
}