みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
開発:Win7 / FMP14 Adv.
クライアント:Win7 / FMP14
サーバー:Win7 / FMS13
クライアントからオブジェクトへインポートされた画像を、サーバー側でリネームしながらエクスポートして色々こねくりまわしたかったのですが、
サーバーサイドスクリプトでは「フィールド内容のエクスポート」が使えませんでした。。。
サーバーサイドスクリプトでオブジェクトフィールドの中身を取ることは出来ませんでしょうか。
画像は相対でなく内部に格納しています。
パスは取れそうなのですが、同名ファイルとかその他諸々の原因でおかしくならないか不安です。
よろしくお願い致します。
リネームするだけなら
Base64Decode(Base64Encode(obj);"filename")
でできるらしいです。
Offline
サーバサイドでエクスポート系の処理はほぼ全滅なので、外部保存のオブジェクトフィールドを作ってそこへフィールド設定すれば。
ただし同名処理は勝手にされるので、Get(UUID)等で自前で回避しないと実ファイル名が取れないかも。
外部保存のパスにレコードIDを使って、同じレコードを同時にエクスポートされないように排他処理をするほうがいいかな。
Offline
あ、忘れてた。
Base64EncodeとBase64Decodeを使って、画像をCSVでエクスポート/インポートする手があったのか・・・。
↓このサイトにあるデモファイルが参考になるかと思います。
http://hbase.net/2013/12/11/filemaker-1 … n-storage/
実用的かどうかはともかく、ご参考まで。
>waderさん
ありがとうございます。
Get(UUID)でフォルダ分けして、バッチファイルをFileMaker内で生成・エクスポートして叩く方向で検討してみます。
別のソフトでリサイズや転送等を行うため、FileMaker内部完結はなかなか難しいかなと思っており、なんとかエクスポートする方法を探しています。
>てんとう虫さん
ありがとうございます。
試してみましたが、自分の今の力では画像をcsvでエクスポートする方法がよくわかりませんでした。。。。orz
エンコードしてデコードの関数を含んだテキストをエクスポートして拡張子をいじってみたりしたのですが。。。
Base64Encode(obj)
のフィールドならテキストなのでCSVでエクスポートできる。
別のソフトでリサイズや転送等を行う前に、別のソフトでDecodeして画像に戻せばいい。
てことでは。
PowerShellの場合、FMPでCSVをエクスポート後、以下のコードを実行すれば画像のデコードが出来ます。
#Convert Base64 to Image
$base64String=Get-Content -Encoding UTF8 "D:\!TEMP\b64enc.csv";
$base64String=$base64String.replace( '"','').replace( "`v","");
$imageBytes = [Convert]::FromBase64String($base64String);
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length);
$ms.Write($imageBytes, 0, $imageBytes.Length);
$image = [System.Drawing.Image]::FromStream($ms, $true);
$image.Save("D:\!TEMP\Image.png") ;
上記例は、ひとつの画像ファイルをCSVをエクスポートし、PowerShellでデコードする場合です。
画像が、複数の場合、だいぶコードの追加が必要です。
で、プラグイン使用なら(手前味噌ですが)、ながらくBETA1だった、ScriptMakerPSのBETA2を公開しました。
FileMaker Server 13,14にも対応しています。
https://sites.google.com/site/scriptmakerps/
これの場合、FileMakerの計算式内にPowerShellの記述が可能なので、比較的容易に
「フィールド内容のエクスポート」と似た処理が行えます。
変数を設定 [$er; 値:
SMPS_Exe( "
<#Convert Base64 to Image#>
$base64String='" & フィールド:Base64エンコードテキスト & "';
$imageBytes = [Convert]::FromBase64String($base64String);
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length);
$ms.Write($imageBytes, 0, $imageBytes.Length);
$image = [System.Drawing.Image]::FromStream($ms, $true);
$image.Save('D:\!TEMP\Image.png') ;
" )
]
※
$image.Save('D:\!TEMP\Image.png') ;
ここを変更すれば、に似の場所に任意のファイル名で保存出来ます。
Offline
>calcerさん
ありがとうございます。そういうことなのですね。
Base64は初めて触れたため扱いがよくわかりませんでした。デコード方法は色々あるということですね。
>qb_dpさん
ありがとうございます。驚愕の回答でした。
PowerShellは全く触れずに生きてこられたのですが最近壁に当たるとなぜか触る機会が増えてきて謎の縁を感じております。まだ全然慣れていませんが・・・
早速ご教示頂いたプラグインを試したところ指定のフォルダに画像が落ちてくるという理想の結果になりました。
ただ、実装が良くないのかloopで複数レコード分(複数枚)吐き出そうとすると1枚目しか出ないようです。。。
変数をクリアするなどなんとなく試してみたのですが、、、難しいです。
※
$image.Save('D:\!TEMP\Image.png') ;
ここを変更すれば、に似の場所に任意のファイル名で保存出来ます。
上記は、変更しているでしょうか?
変更していない場合、最後の画像だけになります。
1つ目の画像だけには、ならないと思われます。
変更例:
SMPS_Exe( "
<#Convert Base64 to Image#>
$base64String='" & フィールド:Base64エンコードテキスト & "';
$imageBytes = [Convert]::FromBase64String($base64String);
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length);
$ms.Write($imageBytes, 0, $imageBytes.Length);
$image = [System.Drawing.Image]::FromStream($ms, $true);
$image.Save('D:\!TEMP\\" & GetAsText ( オブジェクトフィールド ) & "') ;
" )
Offline
qb_dpさん
ご丁寧にありがとうございます。
変更しているつもりです。。。
Loop
変数を設定 [ $Base64Pic ; Base64Encode ( table::画像 ) ]
変数を設定 [ $ExpName ; "D:\img\Pic\\" & table::UniqueID & If ( Right ( table::PicFileName ; 4 ) = "jpeg" ; ".jpg" ; Right ( table::PicFileName ; 4 ) ) ]
変数を設定 [ $er ;
SMPS_Exe( "
<#Convert Base64 to Image#>
$base64String='" & $Base64Pic & "';
$imageBytes = [Convert]::FromBase64String($base64String);
$ms = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length);
$ms.Write($imageBytes, 0, $imageBytes.Length);
$image = [System.Drawing.Image]::FromStream($ms, $true);
$image.Save('" & $ExpName & "') ;
" ) ]
レコード/検索条件/ページヘ移動 [ 次の ; 最後まできたら終了 ]
End Loop
こんな感じでやっているのですが。。。
FMP14にした(かつOSの都合でFMSが13のままである)せいかわかりませんが、画像が大きすぎるとスクリプトそのものが動かなかったりするみたいです。
オブジェクトフィールドにOnObjectModifyで仕込んでいるスクリプトも、
そのフィールドに10MByte以上の画像ファイルがドラッグ・アンド・ドロップされた時に動かないことがあります。。。
仕方ないので別でGetContainerAttribute ( table::画像 ; "MD5" )を自動計算で仕込んだフィールドを用意してそこにもOnObjectModifyで同じスクリプトを仕込むことで回避しましたが。。。
ありがとうございます。とても助かりました。
方法としては出ましたので、一旦こちらは解決にしてしまおうかと思います。
原因がわかりましたので一応書いときます。
ファイル容量が10MBだったとは、想定外でした。
現状では、SMPS_Exe( ) は、30秒でタイムアウトしてしまいます。
30秒以上のPowerSellの処理を待つには、
FileMakerのスクリプトで待つ必要があります。
レコード/検索条件/ページヘ移動 [ 次の ; 最後まできたら終了 ]
の前に待つ処理を入れれば大丈夫になります。
.....
Loop
Exit Loop If [SMPS_Get( "PSThreadState" ) = "Stopped"]
スクリプト一時停止/続行 [間隔(秒): 5]
End Loop
レコード/検索条件/ページヘ移動 [ 次の ; 最後まできたら終了 ]
.....
10MBだとPowerShellのデコード処理に結構時間がかかります。
あと、プラグイン:ScriptMakerPSも大容量引数渡し処理を高速化しました。
最新版は、BETA2.1 です。
https://sites.google.com/site/scriptmakerps/home
こちらを使ったほうが処理が早くなります。
Offline
あまりに処理が遅いので調べました。
劇的に速くなります。
$base64String='" & $Base64Pic & "';
のところ @() を加えます。
$base64String=@('" & $Base64Pic & "');
5MBのファイルで数秒で出力出来ます。
Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 549.58 KiB (Peak: 570.48 KiB) ]