このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

アップロード用 CGI サンプルスクリプト

発言者:田中求之
( Date Friday, January 10, 1997 14:02:09 )


このところファイルのアップロード用 CGI に関する話題が続いていましたので、
参考までに、私がテストに用いた、アップロード用 CGI のサンプルスクリプトを
公開します。

複数のファイルの同時アップロードにも対応しています。

ただし、WebSTAR においては、WebSTAR から CGI に渡される AppleEvent の
データ量に制限が加わっているため、アップロードするファイルのデータのサイズが
合計で 10K 程度までしか受け付けません。この点は注意してください。

ですから、あくまでもアップロードのテストのためのものであって、実用性はあり
ません。

では、スクリプトです(使い方などは後述)。

---- Sample Script of Uploading CGI ---

property crlf : (ASCII character 13) & (ASCII character 10)
property http_10_header : "HTTP/1.0 200 OK" & crlf ツ
  & "Server: WebSTAR/1.0 ID/ACGI" & crlf ツ
  & "MIME-Version: 1.0" & crlf ツ
  & "Content-type: text/html" & crlf & crlf

property post_fldr : "MacintoshHD:post_files:" -- アップロード用フォルダーのパス

on ヌevent WWWスsdocネ path_args ツ
  given ヌclass postネ:post_args
  
  (*
  --- For Debug
  set xxFile to post_fldr & (TimeStamp)
  writeToFile post_args to file xxFile
  *)
  
  set oldDel to AppleScript's text item delimiters
  set AppleScript's text item delimiters to {crlf}
  set xBnoundary to text item 1 of post_args
  set dx to (count (items of (text items of post_args))) - 1
  set bdList to {}
  repeat with x from 1 to dx
    if (text item x of post_args = xBnoundary) then
      set end of bdList to x
    end if
  end repeat
  set dy to count items of bdList
  set end of bdList to dx
  repeat with y from 1 to dy
    set stLine to item y of bdList
    set edLine to item (y + 1) of bdList
    
    if (text item (stLine + 2) of post_args) ュ "" then
      --- CONTENT-TYPE descriptor がある
      set dtLine to (stLine + 4)
    else
      set dtLine to (stLine + 3)
    end if
    
    set tgData to (text items dtLine thru (edLine - 1) of post_args) as string
    set xData to (text item (stLine + 1) of post_args) & " "
    set tgFile to item 1 of (pickUpFromData xData startOf "filename=\"" endOf "\"" with Trim)
    set tgFile to post_fldr & tgFile
    writeToFile tgData to file tgFile
  end repeat
  set AppleScript's text item delimiters to oldDel
  
  return http_10_header & "<TITLE>OK</TITLE>" & crlf ツ
    & "<H1>OK</H1>"
end ヌevent WWWスsdocネ


田中求之 さんからのコメント
( Friday, January 10, 1997 14:09:57 )

このスクリプトは Tanaka's osax 1.0 正式版を必要とします。

また、スクリプトの冒頭の post_fldr プロパティにアップロードされたファイルを
入れておくフォルダーのフルパスを設定しておいてください。

このスクリプトをコンパイルし、post.acgi というような名前で CGIアプリケーション
に変換します。

アップロード用のページの HTML には、以下のような FORM タグを書いておきます。

<FORM ENCTYPE="multipart/form-data" ACTION="post.acgi" METHOD=POST>
File:<INPUT NAME="remotefile" TYPE="file" SIZE=25><P>
<INPUT TYPE="SUBMIT" VALUE="Upload">
<INPUT TYPE="RESET" VALUE="Clear">
</FORM>

この FORM を使ってアップロードされたファイルのデータが、post_fldr で指定した
フォルダーの中に収められます。

SimpleText のテキストファイルになっていますが、データ自体はもとのまま転送
されています。私のテストした範囲では、テキストファイルはもちろんのこと、
GIF や JPEG の転送も問題なく行えました。

なお、くどいようですが、大きなサイズのファイルのアップロードはできません。
この点には注意してください。

また、あくまでもテスト用に作った、動けばいいやという程度のスクリプトですので、
その点も注意してください。

参考になれば幸いです。

田中求之 さんからのコメント
( Friday, January 10, 1997 18:37:16 )

なお、このスクリプトは、WebSTAR 1.3.x, および 2.0 では動きますが、
Quid Pro Quo 1.0, Pictorius NetServers 1.11 では動きません。
( post_args に正しくデータが渡されないため)


西窪洋平 さんからのコメント
( Friday, January 10, 1997 18:39:32 )

>ただし、WebSTAR においては、WebSTAR から CGI に渡される AppleEvent の
>データ量に制限が加わっているため、

これはどうしようもないのでしょうか?

田中求之 さんからのコメント
( Friday, January 10, 1997 18:47:34 )

>これはどうしようもないのでしょうか?

残念ながら、現状では、どうしようもないですね。サーバー( WebSTAR)を作り替えて
もらうしかないですから。

CGI のデータの制限については、以前から、今の AppleEvent Manager では制限が
無くなっているという指摘があるのですが( WebSTAR ML でも何度か投稿されていた
ように思います)、今のところ、仕様を変更する予定はないようですね。