- PR -

DataHandlerからファイル名を取り出す方法

1
投稿者投稿内容
おに
会議室デビュー日: 2004/12/10
投稿数: 3
投稿日時: 2004-12-10 13:20
はじめまして。ファイルのやりとりをするWebサービスを開発しておりまして、
質問があります。ご存知の方、ご教授いただけると非常に助かります。

クライアントは、JavaのGUIです。
Axisを使って、クライアント->サービス、サービス->クライアント双方向で
画像ファイルをやりとりさせようとしています。
よくある例題のとおり、ファイル送信側は、

> File file = new File(<送りたい画像ファイルのパス>);
> FileDataSource source = new FileDataSource(file);
> DataHandler handler = new DataHandler(source);

としてDataHandlerとして画像ファイルを送り、受信側は

> DataSource source = handler.getDataSource();

としてそれを取り出すようにしています。
ところが、こうすると、受信側ではFileDataSourceではなく
ManagedMemoryDataSourceというクラスのオブジェクトに変換
されていて、オリジナルのファイル名が取り出せない、という
問題にぶつかってしまいました。

受信側がオリジナルのファイル名を取り出せるようにするには、
どうすればよいのでしょうか。
ファイル名用にパラメータを1つ追加するというのは、仕様上NGです。
org.apache.axis.attachments.AttachmentPartを使えばいいのかなぁと
考えているのですが、いまいち方法がよく分かりません。

宜しくお願い致します。

[ メッセージ編集済み 編集者: おに 編集日時 2004-12-10 14:05 ]

[ メッセージ編集済み 編集者: おに 編集日時 2004-12-10 14:05 ]

[ メッセージ編集済み 編集者: おに 編集日時 2004-12-10 14:26 ]
kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2004-12-11 01:12
AttachmentPartの
setMimeHeader(String name, String value)

を使えばできるのではないかと、

http://java.sun.com/webservices/docs/1.3/tutorial/doc/SAAJ3.html#wp80876
おに
会議室デビュー日: 2004/12/10
投稿数: 3
投稿日時: 2004-12-14 15:59
kanさん、ありがとうございます。
AttachmentPartとしてやりとりする場合、WSDDファイル(DeploymentDescriptor)の書き方がよくわからず、調査中です。DataHandlerの例しか見つからず。。。
取り急ぎ、お礼まで。
kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2004-12-15 08:38
JAX-RPC APIを使ったHandlerのWSDDの書き方であれば、以下が参考になります。
samples\jaxrpc\hello
おに
会議室デビュー日: 2004/12/10
投稿数: 3
投稿日時: 2004-12-24 00:33
ご連絡がおそくなり、申し訳ありません。
ご指摘いただいた資料を参考に以下のようなサンプルを作ってみたのですが、まだうまく動いていません。
指定されたファイル名をもつ、C:\temp以下のファイルをAttachmentPartにして返すWebサービスですなのですが、実行すると、クライアントにInternal Server ErrorというAxisFaultが返って来てしまいます。

======(Webサービスのコード)=========
import java.io.File;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import org.apache.axis.AxisFault;

public class ImageService {
public javax.xml.soap.AttachmentPart getImage(String filename)
throws AxisFault {
File file = new File("c:\\temp\\" + filename);
if(file.exists()) {
FileDataSource source = new FileDataSource(file);
DataHandler handler = new DataHandler(source);
javax.xml.soap.AttachmentPart attachmentPart
= new org.apache.axis.attachments.AttachmentPart(handler);
attachmentPart.setMimeHeader("filename", filename);
return attachmentPart;
} else {
throw new AxisFault("指定されたファイルは存在しません");
}
}
}
=====================================

======(WSDDの内容)===================
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
<service name="urn:ImageService" provider="java:RPC">
<parameter name="className" value="ImageService"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="session"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JAXRPCHandler">
<parameter name="scope" value="session"/>
<parameter name="className" value="ImageService"/>
</handler>
</requestFlow>
<responseFlow>
<handler type="java:org.apache.axis.handlers.JAXRPCHandler">
<parameter name="scope" value="session"/>
<parameter name="className" value="ImageService"/>
</handler>
</responseFlow>
</service>
</deployment>
===================================
JAX-RPCのことがよく理解できていないため、見当違いのことをやっている可能性もあります。
どこをどう変更すればよいのかご指摘いただけますと、非常に助かります。

[ メッセージ編集済み 編集者: おに 編集日時 2004-12-24 00:34 ]
kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2004-12-24 09:03
AttachmentPartの使い方が違いますね。
メソッドの返りでそのまま使うことはできません。

以下の「SOAPアタッチメントサンプル」を見て下さい。
http://www.beasys.co.jp/dev2dev/code/websvcs.html

Handlerを使った例なので、ちょっと面倒かもしれませんが、
この例だとファイル名をbodyに入れてますね、
1

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