Public/Send-WPSWAttachment.ps1
<#
.SYNOPSIS Uploads attachment to wilma .EXAMPLE Send-WPSWAttachment -Database students -card_id 12345 -form_id 7 Send attachment to to student with id 12345. -form_id 7 is number of form. #> function Send-WPSWAttachment (){ [CmdletBinding()] param( # Database [Parameter(Mandatory=$true)] [validateSet('students','explearning','skilldemo','explearningplaces')] [string] $Database, # card ID [Parameter(Mandatory=$true)] [int] $card_id, # Form id to attach file to [Parameter(Mandatory=$true)] [int] $form_id, # File to attach [Parameter(Mandatory=$true)] [string] $toAttach ) begin{ Write-Verbose "Send-WPSWAttachment begin" $WPSWSession = Get-WPSWCurrentSession $basepath = "/attachments/upload" $database_ids = @{ explearning = 'suortopit' explearningplaces = 'tyossaopp' skilldemo = 'suornaytot' students = 'opphenk' } $referer = "$($WPSWSession.config.url)$($basepath)?tid=$card_id&tdb=$($database_ids[$Database])&formid=$form_id" Write-Debug "generated referer: $referer" try { $fileItem = get-item -Path $toAttach } catch { throw "Send-WPSWAttachment : Cannot find file $file" } Write-Verbose "Send-WPSWAttachment compose multipart content" $multipartContent = [System.Net.Http.MultipartFormDataContent]::new() #content-type headers for name values makes wilma confused $stringHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $stringHeader.Name = "formkey" $StringContent = [System.Net.Http.StringContent]::new($WPSWSession.Result.FormKey) $StringContent.Headers.ContentDisposition = $stringHeader $res = $StringContent.Headers.Remove('Content-Type') $multipartContent.Add($stringContent) $stringHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $stringHeader.Name = "formid" $StringContent = [System.Net.Http.StringContent]::new($form_id) $StringContent.Headers.ContentDisposition = $stringHeader $res = $StringContent.Headers.Remove('Content-Type') $multipartContent.Add($stringContent) $stringHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $stringHeader.Name = "targetid" $StringContent = [System.Net.Http.StringContent]::new($card_id) $StringContent.Headers.ContentDisposition = $stringHeader $res = $StringContent.Headers.Remove('Content-Type') $multipartContent.Add($stringContent) $stringHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $stringHeader.Name = "targetdb" $StringContent = [System.Net.Http.StringContent]::new($database_ids[$Database]) $StringContent.Headers.ContentDisposition = $stringHeader $res = $StringContent.Headers.Remove('Content-Type') $multipartContent.Add($stringContent) $multipartFile = $fileItem.FullName $FileStream = [System.IO.FileStream]::new($multipartFile, [System.IO.FileMode]::Open) $fileHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $fileHeader.Name = "files" $fileHeader.FileName = $fileItem.Name $fileContent = [System.Net.Http.StreamContent]::new($FileStream) $fileContent.Headers.ContentDisposition = $fileHeader if ((Split-Path -Path $fileItem.Name -Extension) -eq '.pdf' ){ $fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/pdf") } else { $fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream") } $multipartContent.Add($fileContent) $Headers = @{ referer = $referer origin = $WPSWSession.config.url dnt = 1 accept = "application/json, text/javascript, */*; q=0.01" } Write-Verbose $multipartContent.Headers } process { Write-Verbose "Send-WPSWAttachment process" try { Write-Verbose "$($WPSWSession.config.url)$basepath" $result = Invoke-WebRequest -Method Post -Headers $Headers -Uri "$($WPSWSession.config.url)$basepath" -ContentType 'multipart/form-data' -Body $multipartContent -WebSession $WPSWSession.WilmaSession #Add $result.content check as almost all requests are returning 200 try {$content = $result.content | ConvertFrom-Json } catch { Write-error "Send-WPSWAttachment cant parse upload results" } if($result.Statuscode -ne 200 -or ($null -eq $content.files )){ Write-Warning "Problem uploading attachment. Statuscode $($result.Statuscode) Content: $($result.content) " } $result } catch{ $ErrorMessage = $_.Exception.Message Write-Error "Could not upload attachment. $ErrorMessage" } } } |