2011-01-31 9 views
13

アプレットについては、BufferedImageファイルを入力ストリームに変換して、MySQLサーバーに画像をアップロードする必要があります。もともと私はこのコードを使用していた。ファイルを作成せずに画像を入力ストリームに変換する

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection connection = 
    DriverManager.getConnection(connectionURL, "user", "pass"); 

psmnt = connection.prepareStatement(
    "insert into save_image(user, image) values(?,?)"); 
psmnt.setString(1, username); 

ImageIO.write(image, "png", new File("C://image.png")); 
File imageFile = new File("C://image.png"); 
FileInputStream fis = new FileInputStream(imageFile); 

psmnt.setBinaryStream(2, (InputStream)fis, (fis.length())); 
int s = psmnt.executeUpdate(); 

if(s > 0) { 
    System.out.println("done"); 
} 

(関連する例外をキャッチしながら)コードは、アプレットがコンピュータに画像を保存しようとする部分にハングアップします。このコードはEclipseで完全に機能していたのですが、ローカルホストからアプレットを実行するたびに問題が発生したため、アプレットがユーザーのコンピュータにファイルを保存する権限に問題があると想定しています。

ユーザーのコンピュータにファイルを保存せずに画像ファイルを入力ストリームに変換する方法があるかどうかは不思議でした。私が使用してみました:

ImageIO.createImageInputStream(image); 

しかし、私はInputStreamImageInputStreamバックを変換することができませんでした。助言がありますか?

ありがとうございます!

+2

argh!データベースから読み込むのと同じコードが画像処理を行います!それはぞっとする。 [Cohesion](http://en.wikipedia.org/wiki/Cohesion_(computer_science))、[Coupling](http://en.wikipedia.org/wiki/Coupling_(computer_science)) –

+0

これはおそらくベストプラクティスではありません。情報をありがとう、私は後でそれを修正する必要があります。 – David

+0

[BufferedImageをInputStreamに変換する方法は?](http://stackoverflow.com/questions/4251383/how-to-convert-bufferedimage-to-inputstream) –

答えて

26

は通常、あなたがその目的のためにByteArrayOutputStreamを使用します。これはメモリ内ストリームとして機能します。

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image,"png", os); 
InputStream fis = new ByteArrayInputStream(os.toByteArray()); 
+0

驚くばかりですが、もう一つ、BinaryStreamを作成するためにストリームの長さが必要なので、os.toByteArray()を使用しますか?length? – David

+3

あなたはそれを試して何が起こったのですか? –

+0

それは完全に働いた。私はos.toByteArray()。上記の長さとコードを使用しました。 – David

1

ByteArrayOutputStreamに書き込みを試みてから、そのデータから読み取るByteArrayInputStreamを作成しましたか? (ByteArrayOutputStreamtoArrayを呼び出し、そのバイト配列をラップしますByteArrayInputStreamのコンストラクタを呼び出す。)

+2

提案していただきありがとうございます。他の答えは実際に私にコードを赤ちゃんに与えました。 :P – David

1

BytArrayストリームを使用することに注意してください。イメージが大きい場合、そのコードは失敗します。私は多くのアプレットコーディングを行っていませんが、書き込みのために一時ディレクトリが利用可能である可能性があります(例えば、File.createTempFile())。

+0

これまでのところうまくいきましたが、もしそれがなければ、私はそれを使わなければなりません。ありがとう – David

関連する問題