プロセルピナ
Top
Internet
Mail
Private
Proxy
Capture
Device
Download
Config
and
Words
Online
Help
Online
Home
[BACK]
☞
Top
>
FileDownload
>
Macro
>
Ex: Command
> Ftp.Upload
フォルダのファイルをFTPアップロードする
(Ex:Ftp.Uploadコマンド)
Macro Top
|
Variables
|
Constants
|
Commands
|
Ex-Commands
書式
・
Ex:Ftp.Upload
コマンド
・
Ex:Ftp.List
コマンド
アップロードのサンプル
次の例は、FTPサーバ「ftp.example.com」に「ftp_user」のユーザーでログインし、 「C:\work\upload」のフォルダにあるファイルを全てアップロードするものです。
:Sample{ str["server"]="ftp.example.com" str["user"]="ftp_user" str["passw"]="ftp_password" Ex:Ftp.List: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" O:result=strl[10] hashTable.id="一覧" O:reply=strl["reply"] O:Xpwd=strl["xpwd"]; put: strl["xpwd"] if (strl["xpwd"].StartsWith{"OK:"} != "true") { put: "Error!" end: } str["upDir"]="C:\\work\\upload" file list: dir=str["upDir"] hashTable.id="Local" HashTable.Contains: id="Local" O:count=intl[10] O:result=strl[10] put: "Local側: " intl[10] "件" intl["Try"]=0; while (true) { Ex:Ftp.Upload: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" files.Dir=str["upDir"] O:result=strl[10] files.AbortOnError=1 files.StoredFiles="UP済" O:okfiles.count=strl["OK数"] O:ngfiles.count=strl["NG数"]; put: value="[Try:" intl["Try"] "] コマンド結果: " strl[10]; if (strl[10].StartsWith{"OK:"} == "true") { break; } culc: intl["Try"]++; if (intl["Try"] > 16) { put: "Error! Tryout!!"; end: } put: "---\r\n"; } end: }
【サンプルの説明】
Ex:Ftp.Uploadコマンドでアップロードする前に、
Ex:Ftp.List
コマンド
を実行していますが、ここではファイル一覧の取得が目的ではなく、
O:Xpwd=
パラメータで取得できるXPWDコマンドの応答を得るのが目的です。 この応答が OK: の3文字で開始されなかった場合は、エラーと判断してそこでマクロを終了します。
file list
コマンド
で、 アップロードするファイルが格納されているフォルダのファイルを数えます。
hashTable.id=
パラメータにより、idが Local のHashテーブルにファイル一覧が設定されるので、その登録個数を
HashTable.Contains
コマンド
で取得し、 putコマンドにより結果出力しています。
次にEx:Ftp.Uploadコマンドでファイルをアップロードしますが、ここでコマンドパラメータ
files.AbortOnError=
1 を指定しています。
これは、アップロード中にエラーが1件でも発生するとコマンドを中断し、
O:result=
で指定した変数 strl[10] に NG: で開始される文字列が設定されることを意味します。
このEx:Ftp.Uploadコマンドは(whileループにより)最大で16回繰り返されますが、 全てのアップロードが成功した時点(strl[10]に OK: で開始される文字列が設定される)で ループを抜けます。 つまり、アップロード途中でのエラー発生は16回まで許容されます。
この例のEx:Ftp.Uploadコマンドでは、
files.StoredFiles=
"UP済"
が指定されています。 これは、idが UP済 のHashテーブルに登録されているファイルは、アップロードしないことを意味します。 同時に、アップロードが成功したファイルは、idが UP済 のHashテーブルに登録されることを意味します。 このパラメータを使用することにより、whileループ内でEx:Ftp.Uploadコマンドを使用しても、 既にアップロードが完了したファイルは再度アップロードしないようにすることができます。
例えば上記例のようなwhileループでアップロードする場合において、 a.jpg、b.jpg、c.jpg、d.jpg の4ファイルが Ex:Ftp.Uploadコマンドの
files.Dir=
で指定するフォルダにあったとします。 Ex:Ftp.Uploadコマンドが、 a.jpg、b.jpg のアップロードに成功し、c.jpg のアップロードで失敗したとします。
O:result=
で指定した変数には NG: で開始される文字列が設定されるのでwhileループは抜けず、 再度、Ex:Ftp.Uploadコマンドが実行されますが、このとき、idが UP済 のHashテーブルには a.jpg、b.jpg のファイルが登録されているので、アップロードは c.jpg と d.jpg のみを対象に行われます。
アップロードのサンプル2
次の例は上記のサンプルに若干の変更を加えたものです。
「C:\work\upload」フォルダにあるファイルを サーバの「接続時のディレクトリ」にアップロードするのは同じですが、 最初に、サーバのファイル一覧とそのファイルサイズを取得し、Hashテーブル(id="一覧")に格納します。 次にローカルフォルダのファイル一覧とそのファイルサイズを取得し、別のHashテーブル(id="Local")に格納します。 この2つのHashテーブルを比較して、ファイル名とファイルサイズが同じものを抽出し、 それをまた別のHashテーブル(id="UP済")に格納します。 id="UP済" のHashテーブルを、Ex:Ftp.Uploadコマンドの
files.StoredFiles=
に指定することにより、 「サイズが一致するファイルはアップロードしない (最初からアップロード対象外にする)」 という処理にすることができます。
:Sample{ str["server"]="ftp.example.com" str["user"]="ftp_user" str["passw"]="ftp_password" Ex:Ftp.List: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" O:result=strl[10] hashTable.shortName hashTable.id="一覧" O:reply=strl["reply"] O:Xpwd=strl["xpwd"]; if (strl[10].StartsWith{"OK:"} != "true") { put: "Error, O:result=" strl[10] end: } put: strl["xpwd"] if (strl["xpwd"].StartsWith{"OK:"} != "true") { put: "Error, O:Xpwd=" strl["xpwd"] end: } HashTable.Contains: id="一覧" O:count=intl[10] O:result=strl[10] put: "Server側: " intl[10] "件" str["upDir"]="C:\\work\\upload" file list: dir=str["upDir"] hashTable.shortName hashTable.id="Local" HashTable.Contains: id="Local" O:count=intl[10] O:result=strl[10] put: "Local側: " intl[10] "件" HashTable.RemoveSame: id.1="Local" id.2="一覧" id.removed="一致" value="int"; HashTable.Dispose: id="Local"; HashTable.Dispose: id="一覧"; strl[10]=str["upDir"] "\\" HashTable.Copy: id.src="一致" id.dest="UP済" key.prepend=strl[10] HashTable.DumpBoth: id="UP済" dir=Dir.DeskTop file="UP済.txt" O:dest=strl[10]; intl["Try"]=0; while (true) { Ex:Ftp.Upload: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" files.Dir=str["upDir"] O:result=strl[10] files.AbortOnError=1 files.StoredFiles="UP済" O:okfiles.count=strl["OK数"] O:ngfiles.count=strl["NG数"]; put: value="[Try:" intl["Try"] "] コマンド結果: " strl[10]; if (strl[10].StartsWith{"OK:"} == "true") { break; } culc: intl["Try"]++; if (intl["Try"] > 16) { put: "Error! Tryout!!"; end: } put: "---\r\n"; } end: }
サーバ側のファイル一覧は Ex:Ftp.Listコマンドで、 ローカルフォルダ側の一覧は
file list
コマンド
で取得します。
どちらのコマンドにも
hashTable.shortName
オプション を使用して、パス部分を含めないファイル名で取得します。
Ex:Ftp.Listコマンドで、
hashTable.shortName
オプション が指定されている場合、Hashテーブルのkeyは パス部分が含まれないファイル名です。 サーバの /user/Yourname/aaa.jpg というファイルは、aaa.jpg として取得されます。
file listコマンドで、
hashTable.shortName
オプション が指定されている場合、Hashテーブルのkeyは パス部分が含まれないファイル名です。 C:\work\upload\aaa.jpg というファイルは、aaa.jpg として取得されます。
HashTable.RemoveSame
コマンド
は、 2つのHashテーブルを比較し、 key
(ここではファイル名)
と value
(ここではファイルサイズ)
の両方が一致するものを
id.removed=
で指定したHashテーブルにコピーし、元の2つのHashテーブルからは削除します。
上記例ではidが "一致" というHashテーブルに、一致したものがコピーされています。
"一致" のHashテーブルのkeyは、 パス部が含まれないファイル名(aaa.jpg
など
) なので、これをそのままEx:Ftp.Uploadコマンドの
files.StoredFiles=
に使用することはできません (
files.StoredFiles=
に指定するには、Hashテーブルのkeyがファイルのフルパスでなければなりません)。
そこで
HashTable.Copy
コマンド
を使用します。 このコマンドはHashテーブルをコピーする際に、 keyの文字列にプレフィクスをつけることができます。プレフィクスにパス部分(末尾は\記号)を指定してコピーすれば、 フルパスのkeyを持つHashテーブルを作成することができます。
Ex:Ftp.Uploadコマンドの
files.StoredFiles=
で指定するHashテーブルは、keyのみ参照されます。 valueに登録されている値(ここではファイルサイズ)は参照されません。
アップロードのサンプル3
次の例は上記のサンプルを更に拡張し、文字列変数 str["Upフォルダ"] に指定したローカルフォルダと、その配下にある imgフォルダ と img2フォルダ をサーバにアップロードするものです。
imgフォルダ と img2フォルダのアップロードは
gosub
コマンド
により サブルーチン UploadSub の呼び出しで処理しています。
gosub: UploadSub("img")
gosub: UploadSub("img2")
サブルーチンをcallするときのパラメータは サーバ側のディレクトリ名であり、かつ、ローカル側のサブフォルダ名です。 サブフォルダ内のローカルファイルは、同じ名前の サーバ側ディレクトリ の中にアップロードされます (該当ディレクトリが存在しない場合は作成)
例えば、ローカル側フォルダ str["Upフォルダ"] に C:\work\upload を指定した場合、 「C:\work\upload」のフォルダにあるファイルは、サーバの
/
ディレクトリ(ftp接続時に
/
でアクセスできるディレクトリ) にアップロードされ、
gosub: UploadSub("img")
により、 「C:\work\upload\img」のフォルダにあるファイルは、サーバの
/img
ディレクトリ にアップロードされます。
同じように、
gosub: UploadSub("img2")
により、 「C:\work\upload\img2」のフォルダにあるファイルは、サーバの
/img2
ディレクトリ にアップロードされます。
UTF-8 :Sample{ str["server"]="ftp_server" str["user"]="ftp_user" str["passw"]="ftp_password" str["Upフォルダ"]="C:\\work\\upload" Ex:Ftp.List: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" O:result=strl[10] hashTable.shortName hashTable.id="一覧" O:reply=strl["reply"] O:Xpwd=strl["xpwd"]; put: strl["xpwd"] if (strl[10].StartsWith{"OK:"} != "true") { put: "Error, O:result=" strl["xpwd"] end: } if (strl["xpwd"].StartsWith{"OK:"} != "true") { put: "Error, O:Xpwd=" strl["xpwd"] end: } HashTable.Contains: id="一覧" O:count=intl[10] O:result=strl[10] put: "Server側: " intl[10] "件" str["upDir"]=str["Upフォルダ"] file list: dir=str["upDir"] hashTable.shortName hashTable.id="Local" HashTable.Contains: id="Local" O:count=intl[10] O:result=strl[10] put: "Local側: " intl[10] "件" HashTable.RemoveSame: id.1="Local" id.2="一覧" id.removed="一致" value="int"; HashTable.Dispose: id="Local"; HashTable.Dispose: id="一覧"; strl[10]=str["upDir"] "\\" HashTable.Copy: id.src="一致" id.dest="UP済" key.prepend=strl[10] //HashTable.DumpBoth: id="UP済" dir=Dir.DeskTop file="UP済.txt" O:dest=strl[10]; intl["Try"]=0; while (true) { Ex:Ftp.Upload: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" files.Dir=str["upDir"] O:result=strl[10] files.AbortOnError=1 files.StoredFiles="UP済" O:okfiles.count=strl["OK数"] O:ngfiles.count=strl["NG数"]; put: value="[Try:" intl["Try"] "] コマンド結果: " strl[10]; if (strl[10].StartsWith{"OK:"} == "true") { break; } culc: intl["Try"]++; if (intl["Try"] > 16) { put: "Error! Tryout!!"; end: } put: "---\r\n"; } gosub: UploadSub("img") gosub: UploadSub("img2") end: } :UploadSub{ //strl[0] サブフォルダ(img, img2, etc) strl["rDir"]="/" strl[0] Ex:Ftp.List: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" O:result=strl[10] hashTable.shortName hashTable.id="一覧" O:reply=strl["reply"] O:Xpwd=strl["xpwd"] rDir=strl["rDir"] put: strl["xpwd"] if (strl[10].StartsWith{"OK:"} != "true") { put: "Error, O:result=" strl["xpwd"] end: } if (strl["xpwd"].StartsWith{"OK:"} != "true") { put: "Error, O:Xpwd=" strl["xpwd"] end: } HashTable.Contains: id="一覧" O:count=intl[10] O:result=strl[10] put: "Server側: " intl[10] "件" str["upDir"]=str["Upフォルダ"] "\\" strl[0] file list: dir=str["upDir"] hashTable.shortName hashTable.id="Local" HashTable.Contains: id="Local" O:count=intl[10] O:result=strl[10] put: "Local側: " intl[10] "件" HashTable.RemoveSame: id.1="Local" id.2="一覧" id.removed="一致" value="int"; HashTable.Dispose: id="Local"; HashTable.Dispose: id="一覧"; strl[10]=str["upDir"] "\\" HashTable.Copy: id.src="一致" id.dest="UP済" key.prepend=strl[10] //HashTable.DumpBoth: id="UP済" dir=Dir.DeskTop file="UP済.txt" O:dest=strl[10]; intl["Try"]=0; while (true) { Ex:Ftp.Upload: server=str["server"] user=str["user"] passw=str["passw"] enc="UTF-8" rDir=str["rDir"] files.Dir=str["upDir"] files.RemoteDir=strl["rDir"] O:result=strl[10] files.AbortOnError=1 files.StoredFiles="UP済" O:okfiles.count=strl["OK数"] O:ngfiles.count=strl["NG数"]; put: value="[Try:" intl["Try"] "] コマンド結果: " strl[10]; if (strl[10].StartsWith{"OK:"} == "true") { break; } culc: intl["Try"]++; if (intl["Try"] > 16) { put: "Error! Tryout!!"; end: } put: "---\r\n"; } return: }
UploadSubサブルーチン内の、 Ex:Ftp.Uploadコマンドの
files.RemoteDir=
パラメータでは アップロード先のディレクトリを指定しています。 そのディレクトリがなかった場合に作成するように
rDir=
パラメータで同じディレクトリを指定しています。
rDir=
パラメータだけの指定では
/
でアクセスできるディレクトリに アップロードされてしまうことに注意してください。
[BACK]
プロセルピナ