Skip to main content.
10月 21st, 2007

JavaScript で最大文字数をByteで設定する

テーブルを見ると,不幸にもそのフィールドが,文字数を半角でも全角でも1文字は1桁としてカウントしてくれるnvarcharでなく,半角は1桁全角は2桁と判断してしまうvarcharに設定されている場合,ブラウザから入力する文字数を何桁で制限すればいいか迷うところじゃないでしょうか。

なぜならHTMLの input=”text” で,最大文字数を20桁と設定すると,半角も全角も20桁までの入力となり,例えば,帳票出力などで,きっちり枠内に文字列を収める為に,半角だけは40桁入力できれば・・ ようなエレガントな対応ができません。

そのような時に,以下の様なJavaScriptを拵えて,onBlur=”isByteCheck(this, 40)” の様に設定してあげてください。
入力文字列を,Byteで計算しサイズをはみ出している場合はメッセージを出します。

一つ目のパラメタは,カレントオブジェクト(input),2つ目のパラメタは,最大入力Byte数です。

以下にソースを覚え書きします。

===

/** 指定バイトを超えたらメッセージを出す
* 戻り値:超えている場合:false
*/
function isByteCheck(obj, maxByte) {
var value = obj.value;

var count = getByteCount(value);
if (count > maxByte) {
alert(”入力文字数が多すぎます。全角(” + (maxByte/2) + “)文字以下に減らしてください。”);
obj.select();
return true;
} else {
return false;
}
}
/** バイト数を計算する
*/
function getByteCount(value) {
var count = 0;
for ( var i = 0; i < value.length; ++i ) {
var sub = value.substring(i, i + 1);
if( checkIsZenkaku(sub) ){
count += 2;
} else {
count += 1;
}
}
return count;
}
/** 全角チェック(全角:true)
*/
function checkIsZenkaku(value) {
for (var i = 0; i < value.length; ++i) {
var c = value.charCodeAt(i);
if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) {
return false;
}
}
return true;
}

以上です。

Posted by seemo as PROGRAM SAMPLE at 1:06 AM JST

3 Comments »

6月 27th, 2007

Strutsで表形式データ(request)の表示と登録を行う(java)

Strutsで表形式のデータの表示や登録を行う場合,利用するActionのstruts-configが「scope="request"」だった場合,思うようにいかないですよね。
あちこち,ネットを調べてみたんですが,なかなか「これだ!」みたいのが無いので,デバッグしながらちょっと調べてみた結果,次のようにすればいいんじゃないかと思いました。

まず,ActionFormは,次の様に普通なってますよね。(リスト部分)

public List list = new ArrayList();

public List getList() {
return list;
}

public void setList(List list) {
this.list = list;
}

そして,listに入るエンティティのクラスに次の様なものがあるとします。

public class TestListEntity implements Serializable {

public String value1 = "";
public String value2 = "";

public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}

}

sessionならば,もうこれで何もする必要はないのですが,requestで利用すると,listのカウントやエンティティとなるオブジェクトの種類が不明です。
従って,ActionFormのメソッドresetを実装して,次のように初期化するメソッドを書いてみます。

public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset(mapping, request);

//リストの初期化
int count = Tool.toInt(request.getParameter("list_count"));
for (int i=0; i<count ; i++) {
list.add(new TestListEntity());
}
}

ポイントとなるのは,list_countですが,これは,Actionがresponseする際,listの件数をページ上にhiddenで載せるようにします。
戻るときは,この値をgetParameterして,リストを再構築するわけです。

応用編として,行追加ですが,面倒な場合は,submitしてlistの行数を増やしてしまえばいいのですが,画面がフラッシュするのを嫌う人は多いことでしょう。その場合は,JavaScriptで行を増やす時に,現在の表の件数をこのlist_countにセットすることを忘れなければ,この方式で利用することができます。

この方法で,たとえ,struts-configが,

<action-mappings>
<action ・・・
scope="request"

となっていても,問題なく新規行も含め自動的にstrutsがセットしてくれます。

なお,jsp側は,インデックスを付け忘れないようにしてください。JavaScriptで行を増やしたりコピーしたりする場合は,ここが一番苦労するでしょう。なぜなら,すべてのフィールド名は,list[index].value1 の様な形式だから,index部分を採番する必要があるでしょうから,僕はsubmitする事にしています。

<logic:iterate id="list" name="XXXXXXForm" property="list" type="TestListEntity" scope="request" indexId="index">

<html :text name="list" property="value1" indexed="true"/>

jspでのポイントは,iterate のID と 各フィールドの<html :text name="list" ・・・> は,ActionFormのフィールド名にばっちりあわせなければなりません。 つまり iterate の id="list" と property="list" は同じ名前にする必要があります。

さあ,これでrequestによるStrutsの表データのやりとりはsessionと同じように利用することができるようになりました。今のところ,この方法でうまくいくようですが,みなさんはどの様にされているのでしょうか?

scope="session"にすれは,いいじゃん みたいな乱暴なサイトもありましたが,実際タブブラウザなどになると,なにかとsessionは問題を引き起こしますよね。

ご指摘などお待ちしております。

Posted by seemo as PROGRAM SAMPLE at 1:25 AM JST

2 Comments »

4月 18th, 2007

テキストボックスプルダウン (改良版)

TextBoxPulldown2

■これ何?
 HTMLのテキストボックスに検索機能付きプルダウンを追加します。

 次のサイトを参考にして作成しました。
 http://itpro.nikkeibp.co.jp/article/COLUMN/20060115/227278/
 
■特徴
 <div>をおかないので,表形式フィールドに対応できます。
 キーボードで操作可能です。⇒改良
 AJAX+DWRを利用しています。⇒改良

■必要なファイル

 /ajax/initcompletion.js
 /ajax/prototype.js

■操作方法

 マウスオーバー :選択色が変化します。
 マウスアウト :選択色が戻ります。
 マウスクリック :値の確定
 ↓キー :選択色が下へ移動します。
 ↑キー :選択色が上へ移動します。
 ESCキー :プルダウンが消えます。
 Enterキー :値の確定

■機能一覧

//プルダウンデータをクリアする
text_pulldown.clearCompletionItems
//横幅をセットする
text_pulldown.setCompletionWidth
//高さを設定する(スクロールがある場合)
text_pulldown.setCompletionHeight
//フォントサイズを設定する
text_pulldown.setCompletionFontSize
//設定を超える行数がある場合スクロールバーを付ける
text_pulldown.setCompletionLine
//プルダウンを表示する
text_pulldown.showCompletionItems = function (ary, callback) {
//プルダウンにフォーカスを移す
onFocus()
//TABの時プルダウンをクリア,エンターの時フォーカスプルダウンへ移す
keydownEvent()
//最後にフォーカスがあたったコントロールの名称を返す(汎用)
lostFocusNext()

■使い方

(1)呼び出し側

function initPulldown(obj) {

if(text_pulldown != null) {
text_pulldown.clearCompletionItems();
}

thisform = document.forms[0];

text_pulldown = obj; //プルダウンを設定するテキストボックス

initCompletion(text_pulldown, “div_field_name”); //プルダウンを作成する
text_pulldown.setCompletionWidth(”5cm”); //設定:プルダウンの横幅(必須)
text_pulldown.clearCompletionItems();

createPulldown(text_pulldown.value); //プルダウンを表示する

}

(2)プルダウンを表示する

function createPulldown(str_value) {}

function setPulldownInfo(data) {}

(4)キーボード操作により確定された場合の処理

function setField(data) {

var tmp = data.split(”\t”);

document.getElementById(”xxx”).value = tmp[0];
document.getElementById(”yyy”).value = tmp[1];

}

 ※キーボードを利用しない場合でもこのメソッドは置いてください

 例: function setField(data) {}

(5)JSP側の書き方

<body onclick="lostPullDown();">

<html:text name="form_name" property="field_name" onfocus="initPulldown(this);" onkeydown="keydownEvent();"/>

</body>

■DWRの戻り値

 次の様なリストを作成して,レスポンスしてください。

VALUE11<TAB>VALUE12
VALUE21<TAB>VALUE22
VALUE31<TAB>VALUE32
VALUE41<TAB>VALUE42

  ・
  ・

■既知の問題点

 ・Key操作でスクロールの速度がフォントサイズによって変化する
  ※15pxで利用すると大丈夫です。

以上

source

Posted by seemo as PROGRAM SAMPLE at 1:04 AM JST

Comments Off

3月 23rd, 2007

PHP5でRSS2.0を読み込んで表示する

ひょんなことで,PHP5で,RSS2.0のフィードを読み込んで,ホームページにリンクを作る事になったので,覚書します

MagpieRSSというライブラリをダウンロードする。
http://magpierss.sourceforge.net/

ダウンロードした,magpierss-0.72.tar.gzというファイルを解凍して,

.inc という拡張子のファイルとextlib/Snoopy.class.inc というファイルを,

例えば,home/rss/ の中に入れる。

home/rss/rss_utils.inc
home/rss/rss_cache.inc
home/rss/rss_parse.inc
home/rss/rss_fetch.inc
home/rss/extlib/Snoopy.class.inc

僕の環境では,すべてUTF-8でPHPなんかも作ってたので,
これらのファイルもみんなUTF-8で保存しなおしました。

さらに,BASIC認証してる場合は,Snoopy.class.incを開いて,
var $user = “userid”;
var $pass = “password”;

を入れればOKですよ。

まず,RSSを呼び出すホームページ(例えばindex.php)に,

require(”./rss/rss_test.php”);
require(”./rss/rss_fetch.inc”);

$rss = new rss_test();

を書き,出力箇所に次のように記述します。

<?php $rss->get($count, $url); ?>

実際RSSを読み込む方法は次の通りです。

class rss_test {

function get($count, $url) {

define(’MAGPIE_OUTPUT_ENCODING’, ‘UTF-8′);

$rss = fetch_rss($url);

array_splice($rss->items, $count);

foreach ($rss->items as $item) {

$href = $item[’link’];

$title = mb_convert_encoding($item[’title’], “UTF-8″, “auto”);

$date=$item[pubdate];

$daytime=date(”Y年m月d日”,strtotime($date));

$daytime = mb_convert_encoding($daytime, “UTF-8″, “auto”);

echo “<li><a href=\”" . $href . “\”>” . $title . “ ” . $daytime . “</a></li>” . “\n”;

}

}

}

以上です。

pubdateは,pubDateではなく全部小文字で書かないと認識しないですよ。

Posted by seemo as PROGRAM SAMPLE at 6:35 PM JST

1 Comment »

3月 12th, 2007

perl からメールを送信する。(特殊文字対応版)

ひょんなことで,perlからメールを自動送信する事になったので,覚書します。

perlからメールって,結構ネットに出てるんで,

簡単にいくかと思っていたら・・

特殊文字(例えば,①ⅱ㈱℡髙塚彅﨑德アイウエオ ㈱㈲彅ⅱ℡゛’など)は,

だいたい化けてしまいますよね。

特殊文字対応のメール送信を扱ってるところってなかなかないんですね。

ようやく試行錯誤して,見つけ出しました。

もしかして,漏れがあったりするかもしれないけど,

概ね大丈夫だと思いますよ。

あちこちのサイトを参考にしながらできたコードなので,

「あ,あそこに似てる?」みたいな感じになってると思います(ごめんなさい)。

許せない人は教えてください。即効消しますので・・

——————————————————-

#必要なライブラリ
use Unicode::Japanese;
use Net::SMTP;

require ‘./jcode.pl’;
require ‘./mimew.pl’;

※Unicode::Japaneseは,こちらから頂戴しました。
(http://search.cpan.org/~hio/Unicode-Japanese-0.40/lib/Unicode/Japanese/JA.pod)

※sendmailではなくNet::SMTPを使いました。

#メール送信プログラム
sub sendmail {

@prm = @_;
my $from = $prm[0];
my $to = $prm[1];
my $subject = $prm[2];
my $msg = $prm[3];

$subject = Unicode::Japanese->new($subject, ‘auto’)->euc; # mimeencodeがeucにしか対応していないらしい

jcode::h2z_euc(\$subject); #subjectには半角カタカナは化けます。
$subject = mimeencode($subject); #MIME エンコード

$msg =~ s/\r\n/\n/g;
$msg = Unicode::Japanese->new($msg, ‘auto’)->jis; #text/plain;charsetをutf8にする場合は”utf8″を指定する

$smtp = Net::SMTP->new($smtp_server, Hello=>”$smtp_server”);

$smtp->mail($from);
$smtp->to($to);
$date = &date;
$smtp->data();
$smtp->datasend(”Date:$date\n”);
$smtp->datasend(”From:$from\n”);
$smtp->datasend(”To:$to\n”);
# $smtp->datasend(”Cc:$cc\n”);
$smtp->datasend(”Subject:$subject\n”);
$smtp->datasend(”Content-Transfer-Encoding: 7bit\n”);
$smtp->datasend(”Content-Type: text/plain;charset=\”ISO-2022-JP\”\n”);
# $smtp->datasend(”Content-Type: text/plain;charset=\”utf-8\”\n”); #utf8
$smtp->datasend(”\n”);
$smtp->datasend(”$msg\n”);
$smtp->dataend();
$smtp->quit;

}

——————————————————-

ここで,大切なのは,通常のJcode(jcode)ではなくて,ありがたいライブラリUnicode::Japaneseを利用した事です。jcodeの変換では\x{3232}見たいな感じで表示されてしまいます。

これがなかったらと思うと,冷や汗でした。著作者の方に感謝いたします。

source

以上

Posted by seemo as PROGRAM SAMPLE at 1:02 PM JST

No Comments »

11月 30th, 2006

C#クライアントからTomcatにHTTP(POST)通信しXMLデータを取得する

ひょんなことで、C#.NETで作成したWindowsアプリケーションとTomcat5(Java)で作成したWebアプリケーションとのHTTP通信を行うシステムを作成したので、覚書します。

サーバ側は、テーブル及びビュー単位にSQL抽出クラスを準備して、
各メソッドは、必ずメッセージクラスを介して実行されるように作成していたので、今回の通信は、メッセージクラスを動的に呼び出すだけでできました。※よかったよかった
ですので、Tomcat(Java)側では、クラスとメソッドとフィールドを動的に判断しXMLデータを返すように作ってみました。

おかげで、Strutsの設定も1個だけでした。

今回は、クライアント側のプログラムだけ覚書します。

詳しい方はご指摘お願いしますね(w

なお、気になるサーバ側は次回覚書します。

<クライアント:C#側>

—————————————————————————-
■通信実行を指示するクラス

jp.seemo.xml.msg.XXXMLMsg  : XMLデータセット
jp.seemo.xml.XXXMLFacility : 通信クラス

この2つのクラスを使って、サーバのクラスに対してメッセージを投げてみました。
サーバ側では、動的にクラスやメソッドを実行したいので、以下の様に実行してほしい機能を呼び出しました。

<xml_facility_class> : データベースからデータを抽出しXMLデータを生成するクラス
<xml_facility_method> : 実際に呼び出すメソッド
<xml_message> : やり取りするデータを表現する型

private jp.seemo.xml.msg.XXXMLMsg getList()
{
//通信メッセージの作成
jp.seemo.xml.msg.XXXMLMsg inMsg = new jp.seemo.xml.msg.XXXMLMsg();

//通信クラスを生成
jp.seemo.xml.XXXMLFacility xf = new jp.seemo.xml.XXXMLFacility(inMsg);

//通信実行
xf.execute(”<xml_facility_class>”, “<xml_facility_method>”, “<xml_message>”);

//レスポンスデータの取得
jp.seemo.xml.msg.XXXMLMsg bean = (jp.seemo.xml.msg.XXXMLMsg)xf.Items;

return bean;

}

—————————————————————————-
■XML通信を行うアブストラクトクラス

次のアブストラクト・クラスを継承して実際の通信処理を実装してみました。これでいちいち通信ロジックを書かなくてこれ一個でいけますね。
※コード内のTool.showSystemErrorは、システムエラーを簡易処理するメソッドです。

using System;

namespace jp.seemo.xml
{
public abstract class XMLFacility
{

protected System.Data.DataSet _items; //実際のキャリア
protected string class_name; //サーバのクラス名
protected string method_name; //サーバのメソッド名
protected string message_class; //サーバのメッセージ名

public XMLFacility(System.Data.DataSet inMsg)
{
this._items = inMsg; //送り側のメッセージ
}

public XMLFacility()
{}

/// <summary>
/// Java側で動的にクラス・メソッド・メッセージを選択する為に名称をセットしリクエストする
/// </summary>
/// <param name=”class_name”>クラス名</param>
/// <param name=”method_name”>メソッド名</param>
/// <param name=”message_class”>メッセージキャリア名</param>
public void execute(string class_name, string method_name, string message_class)
{
this.class_name = class_name;
this.method_name = method_name;
this.message_class = message_class;

httpRequest(); //実際の通信
}

/// <summary>
/// レスポンスデータを解析し、データをセットします。
/// </summary>
/// <param name=”resStream”></param>
protected void httpResponse(System.Xml.XmlTextReader resStream)
{
// XMLをリード
_items.Clear();
_items.ReadXml(resStream);
}

/// <summary>
/// 要求をPOSTし、結果をサーバから得ます。
/// </summary>
protected void httpRequest()
{
const string methodName = “httpRequest”;

System.IO.Stream reqStream = null;
System.Net.WebResponse res = null;
System.IO.Stream resStream = null;
System.IO.TextReader sr = null;

try
{

//バイト型配列に変換
byte[] postDataBytes = System.Text.Encoding.ASCII.GetBytes(postData());

//Requestの作成
System.Net.WebRequest req = System.Net.WebRequest.Create(”http://localhost:8080/xxxx/xmlf.do”);

req.Method = “POST”;
req.ContentType = “application/x-www-form-urlencoded”;
req.ContentLength = postDataBytes.Length;

reqStream = req.GetRequestStream();
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
reqStream.Close();

//response
res = req.GetResponse();
resStream = res.GetResponseStream();

//受信して表示
sr = new System.IO.StreamReader(resStream, Tool.encode);

System.Xml.XmlTextReader tr = new System.Xml.XmlTextReader(sr);

//TEST
//Console.WriteLine(sr.ReadToEnd());

httpResponse(tr);

}
catch(Exception ex)
{
Tool.showSystemError(”XMLFacility”, methodName, ex);
}
finally
{
try
{
if (sr != null)
{
sr.Close();
}
}
catch(Exception ex)
{
Tool.showSystemError(”XMLFacility”, methodName, ex);
}

try
{
if (reqStream != null)
{
reqStream.Close();
}
}
catch(Exception ex)
{
Tool.showSystemError(”XMLFacility”, methodName, ex);
}

try
{
if (resStream != null)
{
resStream.Close();
}
}
catch(Exception ex)
{
Tool.showSystemError(”XMLFacility”, methodName, ex);
}

try
{
if (res != null)
{
res.Close();
}
}
catch(Exception ex)
{
Tool.showSystemError(”XMLFacility”, methodName, ex);
}

}
}

/// <summary>
/// レスポンスデータ
/// </summary>
public System.Data.DataSet Items
{
get
{
return this._items;
}
}

}
}

—————————————————————————-
■XMLFacility(通信用クラス)を継承して作成したクラス

POSTデータをセットして、送信するクラスを完成させます。

namespace jp.seemo.xml
{
/// <summary>
/// 通信ネタ(POSTデータ)を作成し、通信を行う
/// </summary>
public class XXXXMLFacility : XMLFacility
{

private string postData()
{
msg.XXXMLMsg inMsg = (msg.XXXMLMsg)Items;

System.Text.StringBuilder sb = new System.Text.StringBuilder();

int count = inMsg.row.Count;

sb.Append(”class_name=” + System.Web.HttpUtility.UrlEncode(this.class_name));
sb.Append(”&method_name=” + System.Web.HttpUtility.UrlEncode(this.method_name));
sb.Append(”&message_class=” + System.Web.HttpUtility.UrlEncode(this.message_class));

for (int i=0; i<count; i++)
{
sb.Append(”&user_id=” + System.Web.HttpUtility.UrlEncode(inMsg.row[i].user_id, Tool.encode));
sb.Append(”&password=” + System.Web.HttpUtility.UrlEncode(inMsg.row[i].password, Tool.encode));

}

string mystr = sb.ToString();

return mystr;

}

/// <summary>
/// リクエストメッセージを投入する
/// </summary>
/// <param name=”inMsg”></param>
public XXXXMLFacility(System.Data.DataSet inMsg): base(inMsg)
{}

public XXXXMLFacility(){}

}
}

以上です。

Posted by seemo as PROGRAM SAMPLE at 8:25 AM JST

No Comments »

11月 18th, 2006

postgreSQL8.1xにExcelで作成したcsvファイルをインポートする

ひょんなことで、

Excelで作成したcsvファイルを直接postgreSQLに投入する仕事があった時の話やけど・・

よく、DELIMITERを指定するサンプルがあるのですが、あれだと改行や , が含まれると、Excelから保存したてのほやほやファイルではエラーがでますよね。

意外とネットを探し回ってもDELIMITER指定するものばかりで、ぜんぜんうまくいかないんですよね・・・

改行やら区切り文字を変換するPG作るのも大変だし、なんか”さぁ~”っと入ってくれないかな~なんて、思いながらいろいろ調べていると、簡単な事でした(笑)

※でも、調べるのに相当時間がかかりました(涙)

今回も、せっかくなので覚書しておきます。

■postgreSQLへのデータ投入に関して

Excelで作成したCSVファイルは、shift_jisなので、
利用しているデータベースの文字コード(今回はutf-8)に合わせて、
文字コード変換が必要なんです。

知っとるわ~ って?

文字コード変換では、lvを利用しました。
RedhatES4は、初期ではその機能をもっていないので、
追加インストールしました。

なんで始めっから入ってないねん(愚痴

#ダウンロードする
% wget http://www.ff.iij4u.or.jp/~nrt/freeware/lv451.tar.gz
% tar xvfz lv451.tar.gz

% cd lv451/build
% ../src/configure

% make
% make install

#おしまい

▼データ投入手順

<対象データ>
テーブルに会わせた書式のデータをExcelで作成しcsv形式で保存したデータ

<手順>
1)Excel(CSV)保存
2)Redhatファイルシステムへ転送
3)UTF-8形式へ変換 (コマンド)
4)postgreSQLへ取込 (コマンド)

<コマンド>
#utf8へ変換
%lv -Ou8 file_shift_jis.csv > file_utf8.csv
#postgreSQLへ取込
%COPY table_name FROM ‘/file_system/file_name.csv’ CSV QUOTE ‘”‘;

テーブル名がtable01で、ファイル名がtest.csvで、保存場所が/usr/local/src だとすると、こんな感じです。

COPY table01 FROM ‘/usr/local/src/test.csv’ CSV QUOTE ‘”‘;

意外と知らなかったりしますよね。

また、lvは改行コードまで、\r\n -> \n に変えてくれてました。ありがたや~。

以上です。

Posted by seemo as PROGRAM SAMPLE at 12:00 AM JST

No Comments »

11月 15th, 2006

Java1.4.2+Struts1.1でファイルのアップロード

ひょんなことで、

Java+Strutsで、ファイルをアップロードする事になったので、
せっかくなので、その内容をポイントだけ覚書します。

ところで、ファイルアップロードする方法はいろいろあるけど、
ファイルのアップロードのタイミングってどうしてますか?

入力画面の後、確認ページを表示して、
最後の最後に、よかった時だけ、本当にUPしたいですよね。

なぜなら、一発目でUPすると、
確認ページでキャンセルされたとき、そのファイルは残っちゃうので、なんだかいやですよね。

そこでStrutsの、org.apache.struts.upload.FormFileっていう素敵なクラスを使って、最後に本当にUPしたい時にUPするプログラムを作りました。

この型のフィールドをActionFormにセットして、sessionで設定すると、複数個のファイルでも最後の最後に「登録」ボタンを押したときに、サーバに本当にUPする事ができましたよ。

詳しい方、ご指摘お願いしますね・・

1)ActionForm を作成する

import org.apache.struts.upload.FormFile;をインポートし、
private FormFile file;のようなフィールドを作成する。

submitすると勝手にファイルがActionFormに入ります。

複数ファイルを対応する場合は、
import java.util.List; のフィールドを作っておいてそこに、
submit時に現在formのファイル内容を保持するようにします。

XXForm bean= newXXForm();
bean.setFile(frm.getFile());
list.add(bean);
frm.setList(bean);

※このクラスには、コメントなど他の情報を乗せても平気です。

2)実際のアップロードは、確認ページの「登録」ボタンなどが押されたときのアクションで次のように取り出して、サーバーに保存します。

private void upload(XXForm frm, String root_path, String out_file_name) throws Exception {

FormFile fileUp = null;
InputStream is = null;
BufferedInputStream inBuffer= null;
FileOutputStream fos= null;
BufferedOutputStream outBuffer= null;

try{

fileUp = frm.getFile();

is = fileUp.getInputStream();

inBuffer = new BufferedInputStream(is);

fos = new FileOutputStream(root_path + “/” + out_file_name);

outBuffer = new BufferedOutputStream(fos);

int contents = 0;

while ((contents = inBuffer.read()) != -1) {
outBuffer.write(contents);
}

outBuffer.flush();

}finally{
if (outBuffer != null) {
try{
outBuffer.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
outBuffer = null;
}
}
if (fos != null) {
try{
fos.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
fos = null;
}
}
if (inBuffer != null) {
try{
inBuffer.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
inBuffer = null;
}
}
if (is != null) {
try{
is.close();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
is = null;
}
}

try{
fileUp.destroy();
}catch(Exception e){
//<エラーログ吐き出し処理>
}finally{
fileUp = null;
}

}

}

こんな風に簡単にできるのですが、なにせsessionに乗せるので、
ファイルの容量制限は、絶対にしないといけないし、

同じパソコン上で、タブブラウザを使ったり、「ファイル」から新しいWindowsを開いたりして同じ事をしようとすると,
sessionが重複しておかしくなるから、対策が必要ですよ~。

以上です。

Posted by seemo as PROGRAM SAMPLE at 9:09 AM JST

3 Comments »