使用PowerShell将MongoDB文件转化为CGI并显示出来
用将MongoDB文件转化为CGI的PowerShell进行显示
我在更新的间隔上有了一些空隙。暂时我将结束那个不完整的话题。
这是关于从Sikuli访问MongoDB的第二部分 – 提取保存的文件并保存图片。
我的方法是先将其作为日志保存起来,然后在需要查看时将其整合到一个HTML文件中显示。
所以,我认为这算是一种较少使用的方法,我会通过将其转化为CGI化的PowerShell并嵌入BASE64编码到img标签中来实现。
(有关转化为CGI化的PowerShell的详细信息,请参考在Windows2016TP4的IIS上将PowerShell用作CGI。)
ソフト等バージョン備考Windows Server 2016Technical Preview 4(Build 10586)2012R2のHyper-V上で動作PowerShell5.02016TP4標準のままMongoDB3.2.1Windows 64-bit 2008 R2+ legacyMongoDB .NET Driver1.11.0
PowerShell源代码
这完全是偷懒的态度。
虽然没有错误检查,但我想你能明白提取并显示的想法。
##### 指定ファイルをMongoDBから取り出し #####
# ファイル名はクエリーで指定。
# ex: getFile.ps1?file.PNG
write-host "Conten-Type: text/html"
write-host ""
write-host "<html><head></head>"
write-host "<body>"
# ドライバ読み込み
$DRIVER_PATH = "C:\MongoDB\CSharpDriver-1.11.0";
Add-Type -Path "$DRIVER_PATH\MongoDB.Bson.dll";
Add-Type -Path "$DRIVER_PATH\MongoDB.Driver.dll";
# MongoDBの、imgデータベースに接続
$client = New-Object MongoDB.Driver.MongoClient("mongodb://S2016TP4");
$server = $client.GetServer();
$db = $server.GetDatabase("img");
# GridFS接続してファイルを取得
$gridfs = New-Object MongoDB.Driver.GridFS.MongoGridFS($db);
$file = $gridfs.OpenRead($ENV:QUERY_STRING);
# bytes配列に取り込み、BASE64エンコード
$bytes = New-Object byte[] $file.Length;
$file.Read($bytes, 0, $file.Length) > $null;
$base64 = [System.Convert]::ToBase64String($bytes);
# 拡張子を抽出
$ext = $ENV:QUERY_STRING.Substring($ENV:QUERY_STRING.LastIndexOf(".") + 1);
# imgタグで表示
write-host "<img src = 'data:image/$ext;base64, $base64'>"
write-host "</body></html>"
由于在\$file.Read()部分输出了文件大小(以字节为单位),所以使用> $null来清除该输出。
执行结果
在浏览器上设为50%显示。
这次连之前不太清楚的右边和下边的黑色部分也显示出来了呢…
在浏览器上查看源代码,可以看到它被嵌入在BASE64中。
尽管文件大小稍微变大是一个缺点,但处理起来很方便,因为即使有大量的图片,只需要一个HTML文件就可以搞定。