- PR -

クライアントの画像ファイルをサーバへ配置するには

投稿者投稿内容
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-08-08 19:52
お世話になっています。
質問なんですが、クライアントから受取った画像情報(
ファイルパス、ファイルそのものなど)からサーバ側の所定のフォルダへ
画像ファイルを配置(コピー?)したいのですが
どのような方法があるのでしょうか?

現状 FileInputStreamを開きバイトでゴリゴリ読み込み、
それをOutputStreamへ書き込んで行くと考えいます。

(↓暫定としてこんな感じ?)
FileInputStream fis = null;
OutputStream out = null;

try{
fis = new FileInputStream("ファイルパス");
byte[] buf = new byte[4*1024];
int bytesRead;
while((bytesRead = fis.read(buf)) != -1)
{
out.write(buf, 0, bytesRead);
}
}
finally{
if (fis != null)
fis.close();
}


一般的な方法も含めて探しているのですが、探し方が下手なのか
うまく見つけられていない状態です。

引き続き調査もしていますが、どなたか参考になるサイト、方法など
ご存知でしたら教えていただけるとありがたいです。

環境
クライアント Curl(POSTで飛ばしたデータ(ファイル情報等)を
Struts側で受けっています)
サーバ WebSpere6
WAS VM 6.0

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-08 20:18
サーバからクライアントのファイルの取得は基本的にできません。
ですので、クライアントからファイルの情報だけではなく、
ファイルの中身も送信しなければいけません。

#普通に考えて、サーバからクライアントの情報が暗黙的に取得できたら怖いと思われ。
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-08-09 14:41
やはり画像自身を送らないと駄目なんですね。
引用:

クライアントから受取った画像情報(
ファイルパス、ファイルそのものなど)


と頭の片隅にはあったのですが、となるとはやり、受信した
ファイル自身を開きコピって行くしかないみたいなんで、
そこらへんに的を絞って調べていきたいと思います。

回答ありがとうございました
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-08-10 13:14
すいません、また質問させてください。
まず、サーバ、クライアントを意識せず、画像ファイルをコピーする
メソッドを作ってみたのですが、テキストファイルしかうまくコピーで
きません。

以下メソッドを実行するとchk2.gifというファイルは作成され
ファイルサイズも同じなんですが、開くと画像が壊れています。

画像ファイルの場合、特殊な方法が必要になってくるのでしょうか?

コード:
public static void fileCopy() {
	String outFile = "C:\\hoge\\chk2.gif";
	String infile = "C:\\hoge\\chk.gif";
	try{
	    int data;   
	    // ファイル入力ストリームを取得
	    FileReader fr = new FileReader(infile);
	    // ファイル出力ストリームを取得
	    FileWriter fw = new FileWriter(outFile);
	    	while((data=fr.read())!=-1){
	        	System.out.println("画像読込み");
	        	fw.write(data);
	        }
	       fw.close();
	}catch(IOException ex){
    	System.out.println("入出力エラー!");
	    ex.printStackTrace();
	}
}

takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2005-08-10 13:29
こんにちは。
J2SE APIを参照すると、
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/FileReader.html

『FileReader は、文字のストリームを読み込むときに使用します。生のバイトのストリームを読み込むときは、FileInputStream を使用してください。』
とあります。

また、
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/BinaryFileIO.html
この辺りを参照にしてみてはいかがでしょうか?

以上ご参考になれば。
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-08-10 13:31
Reader出なくStreamで読み書きして下さい
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-08-10 13:42
hiroさん、takashiさん、ありがとうございます!
無事コピーされ画像もきれいにコピれました。

コード:
public static void fileCopy() {
	String outFile = "C:\\\\hoge\\\\chk2.gif";
	String infile = "C:\\\\hoge\\\\chk.gif";
	try{
	    int data;   
	    // ファイル入力ストリームを取得
	    FileInputStream  fr = new FileInputStream (infile);
	    // ファイル出力ストリームを取得
	    OutputStream fw = new BufferedOutputStream(new FileOutputStream(outFile));

	    	while((data=fr.read())!=-1){
	        	System.out.println("画像読込み");
	        	fw.write(data);
	        }
	       fw.close();
	    }catch(IOException ex){
	        System.out.println("入出力エラー!");
	        ex.printStackTrace();
	    }
}

n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2005-08-11 15:31
度々失礼します。 以前ローカル環境にてファイルコピーが
無事できたのですが、それをサーバ上で行おうとしていて
苦戦しています。

まず入力ファイルはjsp(動作確認の為Curlではない)にて
コード:

<form action="/hoge/act.do" enctype="multipart/form-data" method="post" >
ファイル名:<input type="file" name="fileName">
<input type="submit" >


と記述し、参照ダイアログにて指定された画像ファイルを送信しています。

それをstruts、ActionクラスにてHttpServletRequestからStreamを取得してコピー処理を
行っているのが以下になります

現象としてはInputStreamのread時に戻り値が -1となってしまって
一度も読み込まれず終了してしまいます。

ご助力お願いします
コード:

public void fileCopy(HttpServletRequest request) {
String outFile = "C:\\\\tmp\\\\hoge.gif";
try{
int data;
// ファイル入力ストリームを取得
System.out.println("DEBUG 1");
InputStream fr = request.getInputStream();
//InputStream fr = new BufferedInputStream(is);

//FileInputStream fr = (FileInputStream) is;

System.out.println("DEBUG 2");
// ファイル出力ストリームを取得
//FileWriter fw = new FileWriter(outFile);
OutputStream fw = new BufferedOutputStream(new FileOutputStream(outFile));

System.out.println("DEBUG fr.read() :" + fr.read());
while((data=fr.read())!=-1){
System.out.println("画像読込み");
fw.write(data);
}
fw.close();
}catch(IOException ex){
System.out.println("入出力エラー!");
ex.printStackTrace();
}
}



※ @it内を検索していて気付いたのですがServletInputStreamからStreamを取得して
コピーを行う場合Actionクラスではなく別クラスにし
extends HttpServlet implements SingleThreadModel {
をクラスに持たせないと実現できないのでしょうか?


[ メッセージ編集済み 編集者: n.w 編集日時 2005-08-11 15:46 ]

スキルアップ/キャリアアップ(JOB@IT)