クラシックASP BASP21を使わないファイルアップロードについてのまとめ(編集中)
BASP21を使わない方法です。
というのも<input type="file" multiple>で複数のファイルをアップロードしようとしたときに、
BASP21では実現できませんでした。
.Netを使ってひとまずアップロードはできたのですが、以前見たBASP21を使わないコードを思い出して、
参考にして実際にやってみようと思い、今ここです。
ひとまずBASP21を使わないでアップロードする方法をググってみた
Request.BinaryReadで取得したデータをADODB.Streamで保存すればできます、ということでした。
また、以前見たコードというのはここの回答にある、
FCKEditorのファイルアップローダにあるよ!です。
FCKEditorはWYSIWYGエディタを探していたときに触ったことがあり、ファイルアップローダがいくつかの言語
から選べるようになっていて、その中にASP(VBScript)も含まれていました。
FCKEditorはここの一番下です。(退役済み)
http://ckeditor.com/download
今はCKEditorです。
CKEditor
CKEditorではファイル関連はCKFinderとして分離されています。
CKFinder
切り出し方
このアップローダのコードを読んでみると、POSTされたデータからファイルのバイナリ部分を切り出しているのかがわかります。
やっている内容としては、
- POSTデータの中の改行(crlf)を検索
- 最初の改行までが区切り文字(Boundary)
- 次の二連続した改行までがフォームの情報(name属性、ファイル名)
- 次の改行までがファイルのデータ
- これをADODB.Streamでファイルに保存
必要になるもの
vbscriptとして、ここで使うものは主に以下の3つです。
- Request.BinaryRead:POSTデータのバイト配列の読み出し
- ADODB.Stream:ファイルの保存、バイト配列のテキスト変換(.ReadText() )
- InStrB:バイト配列から改行を検索
このコードではファイルへの保存が別メソッドになっていましたが、
データ取得部分をコピーし、とりあえずファイルのデータを切り出したら即保存するようにして、
アップロードを確認できました。
そのほか気になる点など
- 改行探すのはいいけど、<textarea>の改行は大丈夫?
- FormとFileでそれぞれ別の配列(Dictionary)を作っているけど、そもそも1つのフォームから送られるのに受け側で分けてしまうのはなんだかしっくりこないのでFormだけにしたい
multipart/form-dataとboundaryについて
RFC2388
サンプルデータ
-----------------------------41184676334 Content-Disposition: form-data; name="files"; filename="new.txt" Content-Type: text/plain ingredients -----------------------------41184676334 Content-Disposition: form-data; name="files"; filename="bew.png" Content-Type: image/png PNG ��� IHDR��Ú��Ø���ʯ��� pHYs��‹��ŽsDÜ��cìIDATxœìa|”EúÇ·÷Þ³›Þ{#´@è]Š;*rö³\ñîüëwÞÙÑ;Ï *¨‡ôÞ‹„„–„ôžìn²›í½ïÿyw! Rƒóý,áÝ÷wÞyߝò{æ}f†q@ âV@ºÕ @ @ ~½ 9Ž@ @Ü2G @ nHŽ#@ ·$ǁ@ ˆ[’ã@ Ä-Éq@ ▁ä8@ qË@r@ ¸e 9Ž@ @Ü2G -----------------------------41184676334--
ここで、「-----------------------------41184676334」がboundaryです。