プロが教えるわが家の防犯対策術!

JSPとServletでクライアントPCにあるファイル(Excel、PDF等)をサーバにコピーするプログラムを作っています。

アプリケーションサーバ:SERVER1
ファイルサーバ    :SERVER2

最終的には上記のようにしたいのですが、今はアプリケーションサーバ、ファイルサーバともSERVER1で開発しております。

下記のようなコーディングして、クライアントPCにあるファイル(FILE1)をSERVER1のフォルダにコピーしようとすると「(FILE1の)ファイルパスが見つかりません。」というエラーが出てしまいます。SERVER1にあるファイルをSERVER1にある別のフォルダにコピーすることはできます。

クライアントPCのファイルをサーバへコピーするには何か設定が必要でしょうか? それともコーディングが悪いのでしょうか?
ご存知の方、お知恵を貸してください。
宜しくお願い致します。

=============================================
public void copy(String src, String dest) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dest);

FileChannel cIn = in.getChannel();
FileChannel cOut = out.getChannel();

cIn.transferTo(0, cIn.size(), cOut);
}
finally {
try {
if(in != null) {
in.close();
}
}
catch(IOException e) {
}
try {
if(out != null) {
out.close();
}
}
catch(IOException e) {
}
}
}

以上、宜しくお願い致します。

A 回答 (2件)

その copy メソッドって普通にローカルのファイルをコピーしようとしているだけですよね? クライアントマシンのファイルは共有されているんですか? (あるいはOSが共にUNIX系ならNFSマウントされている?)。

されていないのなら SERVER1 からは見えないのでコピーできなくて当然だと思いますが。

あと Servlet を使うということは最終的にはクライアントのブラウザからの要求に従ってサーバ側にファイルを送るということだと思いますが、それなら普通にPOSTさせればいいんじゃないですか? (POSTされた後の Servlet での書き方の詳細は知りませんが、HTMLの form は <input type="file">)。
    • good
    • 0
この回答へのお礼

ありがとうございます。
いろいろ言葉が足りず、すみません。

OSはWindowsです。
本番機はWindows2005Server
開発機はWindows2000Server
です。
クライアントマシンはWindowsのさまざまなバージョンです。
ファイルは共有されていません。

あとパラメータはJSPで <input type="file">で入力し、SUBMITして(method="get")、Servletでrequest.getParameter("FILE1")
で取得しています。

やはりServletからローカルは見れませんか。
C:\FILE1とした場合、ServletはサーバのCドライブを探しに行くんでしょうか。
「普通にPOSTさせる」ということは結構単純な事なのでしょうか?

また調べてみます。
すもし気づきの事がございましたら、またご回答お願いします。
ありがとうございました。

お礼日時:2006/01/22 23:07

サーブレットからは、クライアント側のハードディスクの中身は見えません。

クライアントからは単にHTTP経由で問い合わせをしているだけでボリュームはマウントされていませんから。
 サーブレットでクライアントとサーバの間でやりとりできるのは、HTTPを介したデータの送受だけです。従って、フォームにenctype="multipart/form-data"を指定し、<input type=file>でファイルを送信してやり、POSTされたデータを分析してそこからファイルのデータを抜き出し、それをバイナリファイルに保存することになります。
MIMEで送られたデータは、こんな形になっています。

----------Boundary
Content-Disposition form-data: name=??; filename=??
Content-Type: ??

・・・データ・・・

----------Boundary

この前後のよけいな部分をカットし、肝心のデータだけをバイナリファイルで出力するわけです。
ServletInputStream in = request.getInputStream();
これでInputStreamは得られますから、そこから一度全部のデータを読み込んでどこかに保存するなりしておき、冒頭の3行と末尾の1行を取り除いてデータの部分だけを改めてファイルに保存します。基本的な考え方はこんな感じになると思います。
Googleで検索すると以下のようなものがありました。参考まで。

参考URL:http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/p …

この回答への補足

どうもありがとうございます。
お返事が遅れてすみませんでした。

FORMではenctype="multipart/form-data"を指定し、<input type=file>で送信してます。
しかし事情があり、POSTメソッドが使えないのです。
Servlet側でも request.getInputStream()が使えません。
何か他に良い手はございませんでしょうか?

何かアイディアがございましたらお教え下さい。
宜しくお願い致します。

補足日時:2006/01/28 02:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!