- PR -

multipartの値が取得できない!?

投稿者投稿内容
チョニー2
会議室デビュー日: 2007/02/19
投稿数: 6
投稿日時: 2007-02-19 22:34
はじめまして。
よろしくお願いします。

現在、JavaWebStartでファイルアップロードする機能を開発中です。
HttpClientを利用してmultipartのリクエストをサーバに送信しているのですが、
サーバ側でリクエストの解析がうまく行きません。


ソースとエラー内容は以下のようになっています。

[クライアント]
PostMethod post = new PostMethod ("http://localhost");
File file = new File("ファイルパス");

post.setRequestHeader("Content-Type", "multipart/form-data; boundary=-------------426f756e6");
post.setRequestHeader("Accept-Language", "ja");

Part[] parts = {new FilePart(file.getName(), file)};
post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));

HttpClient httpclient = new HttpClient();
httpclient.executeMethod(post);

[サーバ]
Properties props = new Properties();
Session session = Session.getInstance(props);
MimeMessage message = new MimeMessage(session, stream);
message.addHeader("Content-Type", contentType);
Object content_test = message.getContent();
Multipart multipart = (Multipart)content_test;

for (int i = 0; i < multipart.getCount(); i++) { ← ◆ ここでエラー発生
// リクエストパラメータ取得処理
}

[エラーメッセージ]
javax.mail.MessagingException: Missing start boundary


いくら検索しても目当てのものがなかなかヒットせず困っています。
どなたかご教授よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-19 23:13
まずサーバサイドとクライアントサイド、どちらに問題があるのか切り分けてみてはいかがでしょうか。
ブラウザで送信してみるとか、既に動作が確認できてるサーバに送信してみるとか。
チョニー2
会議室デビュー日: 2007/02/19
投稿数: 6
投稿日時: 2007-02-20 12:15
インギ様
返答ありがとうございます。

ブラウザでmultipartリクエストを送信した場合、
サーバ側では問題なく処理されます。

ログを確認したのですが、
「message.addHeader("Content-Type", contentType); 」で
ヘッダに設定しているContent-Typeは、
ブラウザで設定しているのと同形式でした。

"multipart/form-data; boundary=-------------426f756e6"

問題はクライアント側でのboundaryの設定方法に
あるのではないかと思っています。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-20 12:28
ではブラウザが出すリクエストと、JWSクライアントがだすリクエストを見比べてみてはいかがでしょう?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-02-20 12:34
JavaWebStartを使っているのならば、
扱いが面倒なmultipartを使わなくても、
POSTで自由なデータを送る事ができますよ。

サーバー側のインタフェースが決まっているなら別ですが。

ついでに、POSTならBase64をかけずにバイナリを直接送れるので、
転送量も2/3程度に削減できます。

参考までに。。
チョニー2
会議室デビュー日: 2007/02/19
投稿数: 6
投稿日時: 2007-02-20 13:22
インギ様
あしゅ様
返答ありがとうございます。


インギ様

リクエストを表示したところ
ファイルを含んでいる為、バイナリ形式で表示されてしまいます。
リクエストを表示する良い手段はないでしょうか。


あしゅ様

始めはストリームを使っていたのですが
ファイルサイズが32MBを超えると
クライアント側でOutOfMemoryが発生してしまう為
現在の形で解決できないか試行中です。

仕様ではファイルサイズは600MBまで可能となっています。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-02-20 13:49
content-typeをわざわざ設定する必要ありますか?
そこを取ってみたらどうなりますか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-02-20 14:11
引用:

チョニー2さんの書き込み (2007-02-20 13:22) より:
始めはストリームを使っていたのですが
ファイルサイズが32MBを超えると
クライアント側でOutOfMemoryが発生してしまう為
現在の形で解決できないか試行中です。



ByteArrayOutputStreamなどを使ってストリーム全体を
一時的にメモリ上に持つ構造になっていませんか?

JVMの現在のデフォルトのヒープサイズは64MBなので、
その程度の容量でOutOfMemoryになってしまうでしょう。

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