@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

ActionServletでHttpURLConnectionを使って他のサーバーへbyte[]を送りたい

1
投稿者投稿内容
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-08 16:53
2回目の投稿です。
インギ様前回の質問の時最後にご返信頂いていた事に気が付かずすいませんでした、最後にご指摘いただいた様にパスを纏めて置く様に致しました。ご指導ありがとうございました。
今回はHttpURLConnectionを使ってbyte[]を違うサーバーに送りたいのですが送り側と受け取り側の書き方がイマイチ解らないので、又ご教授していただける方いらっしゃいましたらお願い致します。
送り側ActionServlet

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
request.setCharacterEncoding("Shift_JIS");
/*
* ファイルアップロード
*/
UploadForm uploadForm = (UploadForm) form;
FormFile ff = uploadForm.getFile1();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(ff.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream(
"c:/Tomcat5.5/Before.zip"));
int b = 0;
while ((b = bis.read()) != -1) {
bos.write(b);
}
URL url = new URL("http://localhost/Sample/VariousInput.do HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setRequestMethod("POST");
HttpURLConnection.setFollowRedirects(false);
urlconn.setInstanceFollowRedirects(false);
urlconn.setDoOutput(true);
urlconn.setRequestProperty("Accept-Language","multipart/form-data");
/*
* 挿入するデータセット
*/
Map headers = urlconn.getHeaderFields();
Iterator it = headers.keySet().iterator();
while (it.hasNext()) {
byte[] buff = ff.getFileData();

BufferedOutputStream bi = new BufferedOutputStream(urlconn.getOutputStream());
bi.write(buff);

urlconn.connect();// connectionを繋ぐ
urlconn.disconnect();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
}


受け取り側ActionServlet

public class InsertFile extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
/*
* 出力処理
*/
BufferedInputStream bis = new BufferedInputStream(request.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
"c:/Tomcat5.5/webapps/SExam/files/after.zip"));//作らせるディレクトリの名前yyyymmddss/

byte[] base = (byte[])request.getAttribute("accept");
System.out.println(base+"base");
System.out.println(bis+"bis");
System.out.println(bos+"bos");
}

色々とWEB上で探してみたのですが微妙に良く解らなくて色々と試してみたのですがnullPointExceptionとか出て上手くデータが渡せるように書けないのでどなたかご教授お願い致します。
因みに今出ているエラーは
java.net.ProtocolException: Cannot write output after reading input.
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at upload.action.UploadAction.execute(UploadAction.java:69)
at org.apache.struts.action.RequestProcessor.processActionPerform



となっております。
宜しくお願い致します。
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-08 17:03
すみませんスレ立てるところを間違えてしまった様なのですが、同じ内容のスレを乱立させるのも良くないので場違いではありますがこのままでよろしくお願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-08 17:50
「何が」わからないのかハッキリ書きましょう。
色々、なんとなく微妙にわからない、といわれてもアドバイスできません。
NullPointerとか出る件は今回の質問に含まれていないのですか?いるのですか?

「Cannot write output after reading input」
の意味はわかりますよね?
中学生でも分かる程度の英語ですので訳は省きますが
(もしタヌキ氏が小学生なのであればそうおっしゃってください)
HttpURLConnectionには使い方の手順があります。

HTTPのプロトコルがどういうものか理解していれば
なんとなくイメージできると思いますが、要するに、
GETなどのリクエストを投げて、結果としてHTMLなどを
受け取るわけですね。

そこからすれば、データを読み込んだ時点ではすでにリクエストを
投げた後なわけですから、データ送信ができないことが分かると思います。
ぐぐればサンプルを書いてあるページがすぐみつかりますので
まずはServlet抜きにHttpURLConnection単体の使い方を確認してください。

よくばって全部組み立ててからデバッグするよりも結果的に近道のはずですよ。
タヌキ
会議室デビュー日: 2007/03/06
投稿数: 10
投稿日時: 2007-03-08 20:42
nagise様レスありがとうございます。
ご指摘の通り「何が」を明確に記載しておりませんでしたね、すみませんでした。
ようやく解決ができました、上司に言われて頑張っていたのですがどうやらこの方法ではこの後にやらないといけないことが出来ない可能性が有るとの事で違う方法で繋げる事になりました。
お騒がせ致しました、まだまだヒヨッコなので色々と自分に不備があって皆様にご迷惑をかけるかもしれませんがこれからも宜しくお願い致します。
1

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