今、JAVAservletでファイルをアップロードするプログラムを作成しています。
であるサイトを参考に実装することには成功したのですが、予期せぬことに
リクエスト内にある取り出す必要のない情報もいっしょにファイルに書き込まれて
しまいます。FORMのボタンの情報が一番最後についてくるのです。

content-Type: multipart/form-data; boundary= ---------------------------10265533117308
-----------------------------10265533117308
content-disposition: form-data; name="submitter"

username
-----------------------------10265533117308
content-disposition: form-data; name="Uploaded file"; filename="abc"

[... contents ...]  ← ココのみを取り出したい

-----------------------------10265533117308

が、この場所にあるFORMボタンの名前などの情報も引っ付いてしまっている。

------------------------------------------

どうやら、boundary 文字列 で区切られているという事は
調べたのですが、かといって「boundary」がなんなのかさっぱり
わからず、切り離すにもどうしたらいいのかわからない状態なのです。
 何か良い知恵を貸してください。
また、そういったことを詳しく乗せているサイトの情報などもお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

バウンダリとは区切り文字です。


MIMEタイプの1つであるマルチパート形式であるデータの場合に必ずついてきます。
具体的には、

Content-Type: multipart/form-data; bondary=---------------------------10265533117308

がマルチパートメッセージの開始を示すものです。
複数のメッセージ(=データ)は「boundary=」以降の文字列で区切られていることを示しています。
また区切り文字列(この場合は---------------------------10265533117308 )の次の行には次データある場合は必ずMIMEタイプやデータタイプの宣言が付きます。

content-disposition: form-data; name="submitter" ←これです。

このような構造になっているので、メッセージ全体をスキャンして必要な部分のみを切り出せば良いことになります。

参考URLはRFC文書の日本語訳リンク集です。
詳細はMIME関連のRFCをご覧ください。

参考URL:http://www.se.hiroshima-u.ac.jp/~isaki/rfc/list. …
    • good
    • 0
この回答へのお礼

ありがとうございます。おかげさまで不要なデータを取り除くことができました。URLのほうも勉強になりました。また、アドバイスお願いしますね。

お礼日時:2001/12/18 08:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QAjax.Updaterでmultipart/form-dataの送信方法

<html>
<body>
<form action="/hoge.cgi" method="POST" enctype="multipart/form-data" target="if">
arg1:<input type="textbox" name="arg1"/><br/>
<input type="file" name="data" size="60">
<input type="submit" value="Upload" onclick="post()"/>
</form>
<iframe name="if" id="if" frameborder="0" border="0" width="730" height="500" scrolling="yes"></iframe>
</body>
</html>

上記と同じような事をiframeを使わないで実現したいです。
以下の様に書いてみました。

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
function post(){
var url ='/hoge.cgi';
new Ajax.Updater(
$('result'),
url,
{
method: 'POST',
parameters: Form.serialize($("form1")),
contentType: 'multipart/form-data'
}
);
}
</script>
</head>
<body>
<form id="form1" enctype="multipart/form-data">
arg1:<input type="textbox" name="arg1"/><br/>
<input type="file" name="data" size="60">
<input type="button" value="Upload" onclick="post()"/>
</form>
<div id="result"></div>
</body>

しかし、/hoge.cgiには前者と同じようなhttpリクエストがわたりません。前者と同じような(下記(1)参照)httpリクエストを発行するにはどうしたらよいでしょうか?

(1)前者:httpリクエストの例
POST /hoge.cgi HTTP/1.1
CONTENT_LENGTH: 285
CONTENT_TYPE: multipart/form-data; boundary=---------------------------7d8ea171f055c

~中略~

-----------------------------7d8ea171f055c
Content-Disposition: form-data; name="arg1"


-----------------------------7d8ea171f055c
Content-Disposition: form-data; name="data"; filename=""
Content-Type: application/octet-stream


-----------------------------7d8ea171f055c--


(2)後者:httpリクエストの例
POST /hoge.cgi HTTP/1.1
CONTENT_LENGTH: 11
CONTENT_TYPE: multipart/form-data; charset=UTF-8

~中略~

arg1=&data=

<html>
<body>
<form action="/hoge.cgi" method="POST" enctype="multipart/form-data" target="if">
arg1:<input type="textbox" name="arg1"/><br/>
<input type="file" name="data" size="60">
<input type="submit" value="Upload" onclick="post()"/>
</form>
<iframe name="if" id="if" frameborder="0" border="0" width="730" height="500" scrolling="yes"></iframe>
</body>
</html>

上記と同じような事をiframeを使わないで実現したいです。
以下の様に書いてみました。

<!DOCTYPE HT...続きを読む

Aベストアンサー

ver.1.5.1を見たところ、そのままではmultipart/form-dataを送信することはできません。
contentTypeにmultipart/form-dataを指定し、
あらかじめboundaryや各データヘッダを自分で作成し、1つのStringデータにして(自分で送信準備を全て行い)、関数を呼び出さなければならないようです。

ところで、
単純にmultipart/form-dataを送信することが目的ですか?
それとも、ファイルを送信することが目的ですか?

ファイルを送信することが目的なら、JavaScriptのセキュリティー制限により、不可能です。
<input type="file">のデータは、ファイル名しか取得することが出来ません。(valueはreadOnlyです)

また、XMLHttpRequestで扱えるデータはDOM-Stringですので、バイナリデータは扱えません。
おそらく¥0が出てきた時点でデータの送受信が途切れると思います。
ActiveXObjectのMSXML2.XMLHTTPではバイナリデータの”受信”は可能です。

HTMLファイルに<iframe>を書きたくないのなら、
フォームの送信前に$('output').innerHTML='<iframe name="if" id="if style="display:none"></iframe>');
のように、動的にインラインフレームを作ることで対応出来ると思います。
createElementを使うときは、IEのみ
document.createElement('<iframe name="if">')としてください。


単にmultipart/form-dataを送信することが目的なら、
それに対応したライブラリを探すとか(私も公開してますので、最低1つはあるはずです(^^; あ、Content-Lengthはつけてないや)
Form.serializeのかわりにmultipart/form-dataに整形する関数を自分で作るとかしてみてはいかがでしょうか。

ver.1.5.1を見たところ、そのままではmultipart/form-dataを送信することはできません。
contentTypeにmultipart/form-dataを指定し、
あらかじめboundaryや各データヘッダを自分で作成し、1つのStringデータにして(自分で送信準備を全て行い)、関数を呼び出さなければならないようです。

ところで、
単純にmultipart/form-dataを送信することが目的ですか?
それとも、ファイルを送信することが目的ですか?

ファイルを送信することが目的なら、JavaScriptのセキュリティー制限により、不可能です。...続きを読む

Q&= ~0x0c; &= ~0x03; |=1;

JavaScriptで分からないコードがあるので教えてください。


■変数設定
var hoge = 0;


■変数格納
・キーを押した時の条件分岐
  ~なら hoge |= 1;
  または hoge |= 2;
  または hoge |= 3;
  または hoge |= 8;

・キーを離した時の条件分岐
  ~なら hoge &= ~0x0c;
  または hoge &= ~0x03;


■変数使用
・swithch文の条件分岐に利用
  (hoge&0x03)
  (hoge&0x0c)


■質問
・どういう意味でしょうか?
・文字コード?
・ビット演算?

Aベストアンサー

ビット演算してるわね

x = x + a

x += a
って書くことができるの

つまり
hoge |= 1

hoge = hoge | 1
のことね

~はNOTのこと

0x
はアスキーコードの16進数表記ねきっと

0x0c は改ページを意味していて
0x03 は文章の最後を意味している
と思われるわ
全文がないので推測だけど

QContent-Dispositionヘッダーとは

初めまして。今Javaでクライアントからファイルを指定し、サーバーにファイルをアップロード、そしてDBに登録というプログラムを作成しています。
ファイルをサーバーにアップロードした後、そこからファイルの名前などをContent-Dispositionヘッダーと言うものを利用して取得しているのですがこのContent-Dispositionとは一体何なのでしょうか。簡単な説明でも全然大丈夫なのでぜひ教えて下さい。よろしくお願いします。

Aベストアンサー

参考URLに説明があります。

※まずは、自分で検索エンジンを使って"Content Disposition"のキーワードで調べてみては?

参考URL:http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1

QString a = "a"; と String b = new String ("b"); の違い

String a = "a";
String b = new String ("b");

お伺いしたいのですが、
b は String のインスタンスを作ってると思いますが、
a はどんなことをしてるのでしょうか?

Aベストアンサー

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。
if(b1 != b2) System.out.print("b1とは違うインスタンス");
の結果でもわかると思います。

したがって、
String b = new String ("b"); というのは、Integerに例えると
Integer i = new Integer(new Integer(1)); という処理を
していることになり、ひとつ無駄なインスタンス生成となります。

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その...続きを読む

Q

<input type="hidden" name = "hoge">があったとします。
これを、javascriptを使用し nameで検索します。
”hoge”を検索後、その”hoge”という名前を変更する方法を探しています。 

<input type="hidden" name = "hoge">
       ↓↓↓↓↓
<input type="hidden" name = "fuga"> 

リフレッシュ無しで、上記のようにnameを変える方法が知りたいです。

ご存知の方おりましたら、お手数ですが教えていただけませんでしょうか。
宜しくお願いいたします。

Aベストアンサー

タグが特定出来れば、setAttribute等で属性値を変更出来ます。
setAttribute("name","fuga")


人気Q&Aランキング

おすすめ情報