Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

サーバーtoサーバでファイル送信を行う際のContent-Typeについて

初めて利用させて頂きます。

初歩的な事で申し訳ないのですが、よろしくお願いいたします。

現在、相手側cgiより、Http通信にてPOSTで送信されたCSVファイルを受信する処理をJavaにて実装中です。

実装は、Jakartaプロジェクトの、Commons FileUpload ライブラリを使用しておりますが、DiskFileUpload.parseRequestの際に以下のExceptionが発生しております。
 org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded

相手側からは、Content-Typeにapplication/x-www-form-urlencoded;が設定されております。

そこで質問なのですが、
1.ブラウザtoサーバの場合に限らず、サーバtoサーバの場合も、Httpでのファイル送信の際は、Content-Typeはmultipart/form-dataであるべきでしょうか?

2.multipart/form-dataがContent-Typeに設定されていない場合の、ファイル受信の実装方法について、参考ページ等ございましたら、ご教授頂けましたら助かります。ヒントだけで十分です。

よろしくお願いいたします。

7

回答

13898

閲覧

7件の回答

評価

0

>ブラウザtoサーバの場合に限らず、サーバtoサーバの場合も
サーバは相手がなんなのか、どうやって確認するんだ?
とくにcommonsのようなライブラリは。
「クライアント - サーバ」という言葉の意味を、理解していない。

>multipart/form-dataがContent-Typeに設定されていない場合
設定してもらう。

評価

0

>$様

>>multipart/form-dataがContent-Typeに設定されていない場合
>設定してもらう。
やっぱりそうですか。
相手側へ設定頂くようお願いいたします。
理解不足で申し訳ありませんでした。
ありがとうございました。

評価

0

相手側に、Content-Typeを変更するよう依頼しましたが、既に他システムとも連携しているため、変更は難しいとの回答がありました。

再度質問させてください。

POSTで送信されたCSVファイルを受信するには(Content-Typeはapplication/x-www-form-urlencoded)、
どのような方法で実現すればよろしいでしょうか?

過去ログ等、色々調べたのですが、これといった方法が見つけられませんでした。ヒントで十分ですので、よろしくお願いいたします。

---以下、私の試した方法---
1.com.oreilly.servletライブラリのMultipartRequestを使用して受信。
 →Content-Typeがmultipartではないため、予想通りInvalidContentTypeExceptionとなりました。

2.requestのInputStreamから読み込みファイル出力する。
 
以下の処理で、sizeが-1となる。
// 入力用ストリームを取得
ServletInputStream in = request.getInputStream();
size = in.readLine(buffer, 0, buffer.length);
-------------------------- 

評価

0

multipartがどんな風に送られてくるか知ってる?
その内容を解析しなきゃしょうがないよ。

commons.FileUploadはソースがあるんだから、それをコピーして修正してもいいけどなー。

評価

0

>$様

>multipartがどんな風に送られてくるか知ってる?
>その内容を解析しなきゃしょうがないよ。
multipartについては、以前経験があるので、理解しているつもりです。
ただ、今回multipartで送られてきていませんので、受信方法に検討がつけれていない状態です。

意図を理解できていなければすいません。


>commons.FileUploadはソースがあるんだから、それをコピーして修正してもいいけどなー。
ソース取得いたしました。
解析してみようとおもいます。

評価

0

>ただ、今回multipartで送られてきていませんので、
content-typeは単にコンテンツの形式、つまり受信側の処理方法の指針。
実際の形式がこれと同じであるとは限らない。

実際のコンテンツがmultipart形式でないなら、そもそもライブラリを使うという話にはならないし、形式が分からなければ答えようがない。

他のシステムですでに稼働中なら他のシステムの受信部をもらえば、とも思ったんだけど。
そっちで特別な処理をしてないというなら、そもそもCSV「ファイル」じゃなくて、単にCSVが通常のpost送信されてるだけなんじゃないの?
request.getParameter("名前")でふつーに取れるってこと。


それと、request.getInputStream()で1行目に必要な値があるとは限らない。
内容を解析したいなら、最後の1バイトまで取得してみないと確実には分からない。

評価

0

>$様

>content-typeは単にコンテンツの形式、つまり受信側の処理方法の指針。
>実際の形式がこれと同じであるとは限らない。
>実際のコンテンツがmultipart形式でないなら、そもそもライブラリを使うという話にはならないし、形式が分からなければ答えようがない。
>そもそもCSV「ファイル」じゃなくて、単にCSVが通常のpost送信されてるだけなんじゃないの?
>request.getParameter("名前")でふつーに取れるってこと。

すいません、書き方が悪かったです。実際のコンテンツがmultipart形式ではないです。
$様の言われるとおり、getParameterで普通にCSV内容が取得できました。ファイルが送られてくるのではなかったです。。。
ライブラリを使用する必要などないですね。。。

getParameterで取得したStringを、CommonsのFileUtils.writeStringToFileを使用してファイル出力し、正常に処理することができました。

最初からリクエストパラメータはすべてログに出力していたのですが、相手側不具合で、CSVファイル内容が送信されていなかったというのが原因でした。形式がmultipartでもないし、何か別の受信方法があるのかと思い込んでしまっておりました。

的確なアドバイス頂きまして、本当に助かりました。ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。