つまづいた石ころ、ぶつかった壁

問題(と解消)の記録

クラシックASP BASP21を使わないファイルアップロードについてのまとめ(編集中)

BASP21を使わない方法です。

というのも<input type="file" multiple>で複数のファイルをアップロードしようとしたときに、
BASP21では実現できませんでした。


.Netを使ってひとまずアップロードはできたのですが、以前見たBASP21を使わないコードを思い出して、
参考にして実際にやってみようと思い、今ここです。

ひとまずBASP21を使わないでアップロードする方法をググってみた

Request.BinaryReadで取得したデータをADODB.Streamで保存すればできます、ということでした。


また、以前見たコードというのはここの回答にある、

FCKEditorのファイルアップローダにあるよ!です。


FCKEditorはWYSIWYGエディタを探していたときに触ったことがあり、ファイルアップローダがいくつかの言語
から選べるようになっていて、その中にASPVBScript)も含まれていました。

FCKEditorはここの一番下です。(退役済み)
http://ckeditor.com/download
今はCKEditorです。
CKEditor
CKEditorではファイル関連はCKFinderとして分離されています。
CKFinder

切り出し方

このアップローダのコードを読んでみると、POSTされたデータからファイルのバイナリ部分を切り出しているのかがわかります。
やっている内容としては、

  1. POSTデータの中の改行(crlf)を検索
  2. 最初の改行までが区切り文字(Boundary) 
  3. 次の二連続した改行までがフォームの情報(name属性、ファイル名)
  4. 次の改行までがファイルのデータ
  5. これをADODB.Streamでファイルに保存

必要になるもの

vbscriptとして、ここで使うものは主に以下の3つです。

  1. Request.BinaryRead:POSTデータのバイト配列の読み出し
  2. ADODB.Stream:ファイルの保存、バイト配列のテキスト変換(.ReadText() )
  3. 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

&#65533;&#65533;&#65533; IHDR&#65533;&#65533;&#218;&#65533;&#65533;&#216;&#65533;&#65533;&#65533;&#202;&#175;&#65533;&#65533;&#65533; pHYs&#65533;&#65533;&#139;&#65533;&#65533;&#142;sD&#220;&#65533;&#65533;c&#236;IDATx&#156;&#236;&#157;a|&#148;E&#250;&#199;&#183;÷&#222;&#179;&#155;&#222;{#´@&#232;]&#138;;*r&#246;&#179;\&#241;&#238;&#252;&#235;&#157;w&#222;&#217;&#209;;&#207; *¨&#135;&#244;&#222;&#139;&#132;&#132;&#150;&#132;&#244;&#158;&#236;n&#178;&#155;&#237;&#189;&#239;&#255;yw! R&#131;&#243;&#253;,&#225;&#221;÷&#157;w&#222;y&#223;&#157;&#242;{&#230;}f&#134;q&#129;@ &#226;V@&#186;&#213; @ &#129;@ ~&#189; 9&#142;@ &#129;@&#220;2&#144;G &#129;@ nH&#142;#&#129;@ &#183;$&#199;&#129;@ &#136;[&#146;&#227;&#129;@ &#196;-&#201;q&#129;@ &#226;&#150;&#129;&#228;8&#129;@ q&#203;@r&#129;@ &#129;&#184;e 9&#142;@ &#129;@&#220;2&#144;G 
-----------------------------41184676334--

ここで、「-----------------------------41184676334」がboundaryです。