たれながし.info

とあるITエンジニアの備忘録

PowerShellでファイルをHTTP POSTする

PowerShellでファイルをHTTP POSTしたかったので調べてみました。
サーバ側のコードもPHPで作成して、動作確認もしてみます。

環境

クライアント: PowerShell v5.1
サーバ: CentOS7.6+Apache2.4.6+PHP5.4.16

Powershellスクリプト

「192.168.1.1」はWebサーバのIPアドレスです。

###########
# パラメータ
###########
$uri = "http://192.168.1.1"
$filePath = "C:\Users\test\test.txt"

###########
# Body
###########
$fileName = [System.IO.Path]::GetFileName($filePath)
$boundary = '----Boundary'
$tempFile = './tempfile'
$UTF8woBOM = New-Object "System.Text.UTF8Encoding" -ArgumentList @($false)

$sw = New-Object System.IO.StreamWriter($tempFile, $false, $UTF8woBOM)
$sw.Write("--$boundary`nContent-Disposition: form-data; name=`"up_file`"; filename=`"$fileName`"`n")
$sw.Write("Content-Type: application/octet-stream`n`n")
$sw.Close()

$fs = New-Object System.IO.FileStream($tempFile, [System.IO.FileMode]::Append)
$bw = New-Object System.IO.BinaryWriter($fs)
$fileBinary = [System.IO.File]::ReadAllBytes($filePath)
$bw.Write($fileBinary)
$bw.Close()

$sw = New-Object System.IO.StreamWriter($tempFile, $true, $UTF8woBOM)
$sw.Write("`n--$boundary--`n")
$sw.Close()

###########
# Post
###########
Invoke-RestMethod -Method POST -Uri $uri -ContentType "multipart/form-data; boundary=$boundary" -InFile $tempFile
Remove-Item $tempFile

サーバ側コード(PHP

動作確認のためのサーバ側のコードとなります。言語はPHPです。
簡易的なアップローダーとなります。

<?php
$tempfile = $_FILES['up_file']['tmp_name'];
$filename = './up_file/' . $_FILES['up_file']['name'];

if (is_uploaded_file($tempfile)) {
        move_uploaded_file($tempfile, $filename);
}
?>

動作確認

「/var/www/html」配下に上記のPHPを「index.php」として配置し、「up_file」フォルダも作成します。

# ls -lR /var/www/html
/var/www/html:
合計 4
-rw-r--r--  1 apache apache 191 11月  7 23:35 index.php
drwxr-xr-x. 2 apache apache  22 11月  7 23:38 up_file

クライアント側でPowerShellを実行したところ、ファイル「test.txt」を無事アップロードできました

/var/www/html/up_file:
合計 4
-rw-r--r-- 1 apache apache 30 11月  7 23:38 test.txt

# cat /var/www/html/up_file/test.txt
テストファイルです。