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

問題(と解消)の記録

クラシック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です。


SQLの整形

SQLの整形に使っているツールです。


Sql整形(SqlLite)
インストール不要です。

手順

  1. 貼り付ける
  2. F2

以上。軽くて便利です。



WEBサービスもいろいろあるみたいです。
Beautiful SQL Formatter


リーダブルコード

リーダブルコードを読みました。


とても読み進めやすい内容でした。
読み終えたのはお盆前くらいですが、とりあえずこれだけでもすぐに思い出せます。

  • 日本語に置き換えただけの意味のないコメントをしない
  • 説明変数を使う
  • 三項演算子はそれによって読みやすくなる場合だけ使う


基本指針(引用の引用)

「すなわち、われわれの主な仕事がコンピュータに何をさせるかを命令することだと思わずに、
人間に対してコンピュータに何をしてほしいかを説明することに集中すべきである
P220 『文芸的プログラミング』からの引用

あとがきの参考文献の内容からの引用で、本書の意味何?となってしまいますが、ここにすべてが凝縮されていると思いました。
別の誰か、あるいは三日後の自分に向けて、わかるように書いておくこと。

そういえば

変数名にNewって付けるのはやめてほしいですよね。
あっというまにNewではなくなっていくところを見たのは一度や二度ではないです。



以下、今度読む。

文芸的プログラミング (ASCII SOFTWARE SCIENCE Programming Paradigm)

文芸的プログラミング (ASCII SOFTWARE SCIENCE Programming Paradigm)


リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

よく使うオブジェクトを楽に定義する方法

vbsですが、wsfにするとよく使うオブジェクトをあらかじめ定義できます。

やり方

  1. タグを書く
  2. 変数名とオブジェクトを指定する

以上です。
FSOやADODB関連など、必ず使うモノはここで書いておいて、コードもスッキリしました。

<package>
  <job id="main">
    <?job error="true" debug="true" ?>
    <object id="objFSO" progid="Scripting.FileSystemObject" />
    <object id="objXHR" progid="MSXML2.XMLHTTP" />
    <object id="objXml" progid="MSXML2.DOMDocument" />
    <object id="objStream" progid="ADODB.Stream" />
    <script language="VBScript" src="LogWriter.vbs"/>
    <script language="VBScript" src="inc/Utils.vbs"/>
    <script language="VBScript">
      Option Explicit

      msgbox "こんにちは!"
    </script>
  </job>
</package>


・参考
よく利用するジョブをスクリプトレットでコンポーネント化する
レジストリ登録して再利用もできるんですねー。


それにしてもこういう情報は全部古いですね。。
レガシーすぎる。。。

Mac Book Air 熱対策

毎日毎日熱くて仕方がないですね。
MacBookAirのホットなバディーです。


Youtubeで動画を見ようものなら、すぐに発熱し始める代謝の良さに、
スリムな秘訣を見出せそうなものですが、上部の数字キーあたりの熱さは結構なものです。



部屋が涼しくても指元は汗ばむ、なんていう状態でしたが、
いただき物でこれがあったことを思い出しました。

フィート USB ファン FEET USB FAN [ ブラック ] 扇風機

フィート USB ファン FEET USB FAN [ ブラック ] 扇風機



色はカーキです。
電源はUSBのでOKです。

いざ送風!!

効果はこのくらいです。
熱い→あったかい

抜群ですね!


ファンの音はしますが、気にならない程度。
アマゾンで見てると千円以下であるみたいです。









[rakuten:importshopaqua:10001588:detail]

IIS ASPでバッファの上限を超えるファイルをダウンロード

IISの設定で応答バッファの上限が設定できますが、以下のサンプルケースのように
それを超えるサイズのファイルをダウンロードする方法です。

・サンプル
IISの設定:応答バッファの上限5MB
ダウンロードするファイル:100MB



以前調べて解消していたのですが、忘れてしまって再度調べたのでメモります。

概要としては、少しずつ小出しにしてあげるとうまくいきました。

参照記事は以下です。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46400&forum=7


全体の流れとしては、

① Response.Buffer = True

② ADODB.Streamで、ファイルを1KBずつなど細かく読み取る

③ Response.Flushでバッファのデータをクライアントに小出しに返す

④ ②→③を繰り返し

という感じです。



水がいっぱいになる前に、バケツをあけないと!


考えてみれば当たり前でした。。

SQL SERVER サービス再起動バッチ

SQLの再起動ですが、いつもはインスタンス右クリック→再起動でやっていたのですが、
コマンドから実行する必要が出てきたので調べました。

SQL Server のインスタンスを起動する方法 (net コマンド)
SQL SERVERのインスタンスをコマンドで再起動する


上記を参考に、やった内容はこちら。

REM エージェントから停止
net stop "SQL Server Agent (MSSQLSERVER)"
net stop "SQL Server (MSSQLSERVER)"

REM 開始
net start "SQL Server (MSSQLSERVER)"
net start "SQL Server Agent (MSSQLSERVER)"


停めて再開。




既定のインスタンスだったのでMSSQLSERVERとしています。
と言いつつ、既定のインスタンスかどうかわからなかったので、
管理ツール → サービスから確認しました。
サービス名に
SQL Server (MSSQLSERVER)ってまんま出ていたので、迷うことはなかったです。