• 締切済み

初投稿です。

初投稿です。 質問の仕方がおかしいかもしれませんが、宜しくお願いいたします。 業務でウェブアプリケーションを作っています。 【質問】 FireFox でAjax でデータを送信すると、Content-Type に「application/x-www-form-urlencoded; charset=UTF-8」が設定されてしまいます。 jQuery の $.ajax() のオプションで、「contentType:"application/x-www-form-urlencoded"」と指定しているのですが、必ず「charset=UTF-8」が付加されてしまします。 何とか「charset=UTF-8」の付加を回避する方法は無いでしょうか? ちなみに開発環境は次の様になっています。 【サーバ】 OS:CentOS5.5(エンコードはEUC_JP) Webサーバ:Apach 2.0.63 DB:PostgreSQL 8.2.14 開発言語:Perl v5.8.7 CGI JavaScriptライブラリ:jQuery 1.4.3 【クライアント】 OS:WindowsXP SP3 ブラウザ:IE8、FireFox3.6.11、Safari4.0.4 charset=UTF-8」が設定されてしまい、送信した値がCGIで受け取れない。 【質問の背景】 サーバ側でデータが取得できない原因は、Perlモジュールの(CGI)Lite.pmがフォームの値を取得する処理で、次のようなコードとなっているためです。 ※一部抜粋します。 sub parse_form_data{ $content_type = $ENV{CONTENT_TYPE}; #####▼ 問題はこの部分です。 if (!$content_type || ($content_type eq 'application/x-www-form-urlencoded')) { #####▲ local $^W = 0; read (STDIN, $post_data, $content_length); $self->_decode_url_encoded_data (\$post_data, 'form'); return wantarray ? %{ $self->{web_data} } : $self->{web_data}; } elsif ($content_type =~ /multipart\/form-data/) { ($boundary) = $content_type =~ /boundary=(\S+)$/; $self->_parse_multipart_data ($content_length, $boundary); return wantarray ? %{ $self->{web_data} } : $self->{web_data}; } else { $self->_error ('Invalid content type!'); } } 上記の書き方では、$content_type に値が入ってこないか、「application/x-www-form-urlencoded」だったらとなってしまいます。(あってますよね) 「charset=UTF-8」が付加されたときここを通ってくれずエラー扱いされてしまいます。 先輩に相談したところ、できるだけサーバのモジュールはいじりたくないとのことです。 また、GETメソッドもできるだけ使いたくないといわれました。 長文になってしまいましたが、なにとぞ宜しくおねがいいたします。

みんなの回答

noname#205944
noname#205944
回答No.2

もし、shinjin_08さん の言うような処理が行われているとしたらモジュールが古いのかもしれません CGIモジュールは世界中の人が使っているはずなので、なんらかの対応がなされているはずです モジュールのバージョンを最新のにしたらいいような気もします。 >先輩に相談したところ、できるだけサーバのモジュールはいじりたくないとのことです。 そのとおりです!! いじる=モジュールを書き換える なんてのは絶対にしてはいけないことですよ オーバーライドという方法があります。 先に呼び出した関数と同じ名前の関数を後からつくるとオーバーライドしたことになります モジュール名::関数名 もしくは $モジュール名::変数名 が正式な関数名ですので、この方法も選択肢の一つになると思います。 このほかにも、やり方はいろいろあります。 他のコードとのからみやサーバ権限の問題もあるでしょうから とりあえずここまでにしときますね そ・れ・と 質問のタイトル 質問内容がわかりやすいようにしたほうが 後の方のためにもなると思いますよー

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

上記の書き方では、$content_type に値が入ってこないか、「application/x-www-form-urlencoded」だったらとなってしまいます。(あってますよね) =>PerlのLite.pmでのリクエストヘッダーの取得について、詳しいわけじゃ   ないですが、違うと思います。  $content_typeはあくまで、"application/x-www-form-urlencoded"で、  "charset=UTF-8"は 、$charset "UTF-8" じゃないでしょうか?

shinjin_08
質問者

お礼

回答ありがとうございます。 $content_typeはあくまで、"application/x-www-form-urlencoded"で、 "charset=UTF-8"は 、$charset "UTF-8" じゃないでしょうか? → 私の文章が悪かったですね。   言いたかったのは、$content_type="application/x-www-form-urlencoded; charset=UTF-8"と値が   入ってくるので、絶対にエラーになってしまうといいたかったのです。   ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Ajax.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=

  • InetでHTTPのPOST設定方法

    Inetコントロールで、HTTPサーバにPOSTを使用しデータを送信しようと考えているのですが、 いろいろ調べたところ、できるようになりました。 ソースは以下の通りです。 Inet1.Execute "アドレス" _, "POST" _, "msg=あああ" _, "Content-Type: application/x-www-form-urlencoded" 上記のソースでサーバ側でmsgと指定し「あああ」という値を 取得することができました。 しかし、POSTで複数のデータを送ることができません。 例えば値をnameとmsgの二つを送る場合、 "msg=あああ"の部分にどのように記述すればよいのでしょうか? それとも根本的に何か違うのでしょうか? よろしくお願いします。

  • pythonのプログラムを走らせるには?

    使用するソフトウェアの関係でWeb(HTMLまたはPHP)とPythonの連携が必要になりました。 しかしPythonをWebで扱ったことがなくいまいちどうしたらいいのか分りません。 <form action="/python/pythontest.py" method="GET">  <input type="submit" name="submit" value="更新"> </form> といった形で呼び出しているのですがファイルが開かれるだけでptythonのプログラムが実行されません。 pythonのプログラムは #!/usr/bin/env python # coding: utf-8 import cgi from datetime import datetime html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" content='' print "Content-type: text/html;charset=utf-8\n" print (html_body % content).encode('utf-8') と書いています。 何が原因なのでしょうか? /usr/bin/env python のパスがうまく通っていないからでしょうか?

    • ベストアンサー
    • HTML
  • GeckoWebBrowserどうやってpost?

    はじめてGeckoWebBrowserを使うので全然わかりません。。。次のような方法でPostすると一つ目のURLのページに行くだけでした、Postは何もしなかったのようです。いろいろGeckoLoadFlagsを変えて見ましたが変わりませんでした。 今すっごく悩んでいます。。。 web.Navigate("http://www.mbok.jp/_my0", GeckoLoadFlags.FirstLoad, null, Encoding.GetEncoding("Shift_JIS").GetBytes(poststr), "Content-Type: application/x-www-form-urlencoded" + Environment.NewLine); PS:Windows Form Webbrowserが別の用途で使っていますので、ここは別のWebエンジンを使います、GeckoWebBrowserを選びました。 ぜひ助けてください!

  • Netscape で submit() を複数起動できない

    以前に教わった方法で、submit() を使って別ウィンドウに結果を表示させる Javascript を書きました。 IE では、できたのですが、NN(Netscape Communicator 4.7) では以下の Javascript が起動しません。 というか、最後の form3.submit() のみ起動します。submit() の間に alert(); を入れておくと 3 つのウィンドウが開くので、動くことは 動いているようなのですが...。なぜでしょう? --------ここから(ソースの一部) ---------- <SCRIPT LANGUAGE="JavaScript"> <!-- function OpenWin(){ document.form1.submit(); document.form2.submit(); document.form3.submit(); } // --> </SCRIPT> <form name="PapyrusForm" method="POST" action=""> <input type="text" name="searchword" size="60" maxlength="256"><BR> <input type="button" name="Search" value=" 検索 " onClick="OpenWin()"> </FORM> <!-- =========================================== --> <FORM ACTION="/cgi-bin/searchlist1.pl" target="window1" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" NAME="form1"> </FORM> <FORM ACTION="/cgi-bin/searchlist2.pl" target="window2" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" NAME="form2"> </FORM> <FORM ACTION="/cgi-bin/searchlist3.pl" target="window3" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" NAME="form3"> </FORM>

  • サーバーでのデコード方法(例えばbase64)

    質問内容 サーバーでのPHPスクリプトではアップロードされたファイルのデコードを行うにはContent-Transfer-Encoding: base64をみて 適切にデコード処理をするのだと考えますがContent-Transfer-Encoding: base64を取得する方法はどのようにすればいいか わからなくて困っています。 $_FILES,getallheaders(),file_get_contents('php://input')等を試しましたが必要な情報は得られませんでした。 知りたい内容は 1.ポストされたアップロードファイルのデコードはどのような判定方法になるか。 2.私は先にも記述しましたがContent-Transfer-Encoding: base64行を判定の基準とするものとと考えています、でもその内容の取得方法がわかりません。 3.および、これらの関連として生のデータ取得についても教えていただければ幸いです。($_POSTや$_FILESに加工される前の情報) 環境: SERVER_SOFTWARE : Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.8 下記はHTTPプロトコルでサーバーに送られたデータストリームです。 (info1とinfo2は質問内容には直接関係はありません) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ POST /test/xxxx.php HTTP/1.0 Host: 192.168.xxx.uuu User-Agent: wxWidgets 2.x Content-Length: nnn Content-type: multipart/form-data; boundary=_--Boundary_separator --_--Boundary_separator Content-Disposition: form-data; name="info1" AAAAAAAAAAAAAAA --_--Boundary_separator Content-Disposition: form-data; name="info2" BBBBBBBBBBBBBBB --_--Boundary_separator Content-Disposition: form-data; name="file"; filename="anyfile.jpg" Content-Type: multipart/form-data Content-Transfer-Encoding: base64 base64でencodeされたデータ内容の羅列 --_--Boundary_separator-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 以上 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Formのget

    formからgetメソッドでエンコードをapplication/x-www-form-urlencodedで別のwindowのURLへデータを数個受け渡してます。 さて、ここでなんですが このデータを表示させるhtmlがわからないのです・・。 たとえば http://www.●●.htm?id=1 とあった場合、どう記載すれば表示されるのでしょうか?

  • sendmail -fオプションの指定はどこで行えばいいでしょうか?

    キャノネットというサーバーでフリーのメールフォームCGI設置を試みました、-fと-tオプション設定を行わなければならないみたいなのですが、今回使用したいCGIの初期設定ファイルsendmail指定部分下記に #sendmailのパス $init->{sendmail_path} = '/usr/local/bin/sendmail -t -f ' メールアドレス' '; と指定しましたがCGIエラーとなってしまい、どうやらプログラム内を書き換える必要があるみたいなのですが、知識不足のため どうやって変更するのかがわからず困っております。 お詳しい方、下記のプログラム内の変更部分をお教え下さい。 よろしくお願い致します。 (CGIはURLのものを使用しております。) http://www.web-liberty.net/download/mailplus/index.html -------------------------------------------------- package webliberty::Sendmail; use strict; use Jcode; use webliberty::Encoder; ### コンストラクタ sub new { my $class = shift; my $self = { sendmail => shift, send_to => undef, send_from => undef, subject => undef, name => undef, message => undef, files => undef, x_mailer => undef }; bless $self, $class; return $self; } ### メール送信 sub sendmail { my $self = shift; my %args = @_; $self->{send_to} = $args{'send_to'}; $self->{send_from} = $args{'send_from'}; $self->{subject} = $args{'subject'}; $self->{name} = $args{'name'}; $self->{message} = $args{'message'}; $self->{files} = $args{'files'}; $self->{x_mailer} = $args{'x_mailer'}; if (!$self->{send_to}) { $self->{send_to} = 'example@example.com'; } if (!$self->{send_from}) { $self->{send_from} = 'example@example.com'; } if (!$self->{subject}) { $self->{subject} = 'No Subject'; } if (!$self->{message}) { $self->{message} = 'No Message'; } if (!$self->{x_mailer}) { $self->{x_mailer} = 'Web Liberty'; } foreach ($self->{subject}, $self->{name}, $self->{message}) { $_ =~ s/<br ?/>/?n/g; $_ =~ s/&amp;/&/g; $_ =~ s/&lt;/</g; $_ =~ s/&gt;/>/g; $_ =~ s/&quot;/"/g; } if ($self->{name}) { $self->{send_from} = "?"" . $self->_encode($self->{name}) . "?" <$self->{send_from}>"; } $self->{message} =~ s/?xEF?xBD?x9E/?xE3?x80?x9C/g; $self->{message} = Jcode->new($self->{message}, 'utf8')->jis; my @files = split(/?n/, $args{'files'}); my $boundary; if ($files[0]) { require webliberty::File; $boundary = time; while ($self->{message} =~ /$boundary/) { $boundary++; } } open(webliberty_Sendmail, "| $self->{sendmail} -t") or return(0, "Sendmail Error : $self->{sendmail}"); print webliberty_Sendmail "X-Mailer: $self->{x_mailer}?n"; print webliberty_Sendmail "To: $self->{send_to}?n"; print webliberty_Sendmail "From: $self->{send_from}?n"; print webliberty_Sendmail "Subject: " . $self->_encode($self->{subject}) . "?n"; if ($files[0]) { print webliberty_Sendmail "Content-Type: multipart/mixed; boundary=?"$boundary?"?n?n"; print webliberty_Sendmail "--$boundary?n"; } print webliberty_Sendmail "Content-Transfer-Encoding: 7bit?n"; print webliberty_Sendmail "Content-Type: text/plain; charset=iso-2022-jp?n?n"; print webliberty_Sendmail "$self->{message}?n"; foreach (@files) { my $file_ins = new webliberty::File($_); my $file_name = $file_ins->get_name . '.' . $file_ins->get_ext; print webliberty_Sendmail "--$boundary?n"; print webliberty_Sendmail "Content-Type: application/octet-stream; name=?"$file_name?"?n"; print webliberty_Sendmail "Content-Transfer-Encoding: X-uuencode?n"; print webliberty_Sendmail "Content-Disposition: attachment; filename=?"$file_name?"?n?n"; if (open(webliberty_Sendmail_FILE, $_)) { binmode(webliberty_Sendmail_FILE); print webliberty_Sendmail $self->_uuencode(join('', <webliberty_Sendmail_FILE>), $file_name); close(webliberty_Sendmail_FILE); } } close(webliberty_Sendmail); return 1; }

    • ベストアンサー
    • CGI
  • LWPでPOST送信した後に送信先に移動したい

    LWPで別サーバーのtest.cgiに以下のようなコードで POST送信しています。 use HTTP::Request::Common; use LWP::UserAgent; $query="param1=dummy"; $ua = LWP::UserAgent->new(); $req = HTTP::Request->new(POST => "http://xxx.xxx.xxx/test.cgi"); $req -> content_type('application/x-www-form-urlencoded'); $req -> content($query); $res = $ua->request($req); $success = $res -> is_success; if(!$success){ die("error"); } $con = $res -> content; この場合、$conにtest.cgiの出力が入るだけで、 URLのhttp://xxx.xxx.xxx/test.cgiに遷移することはできません。 HTMLのformタグでPOST送信したときのように、 POSTでデータを送信してかつ、その送信先に移動するということはできるのでしょうか。 LWPでなくてもいいです。 要するにHTMLのformタグでのPOST送信を手動ではなく、自動で行いたいわけですが、 <form action="http://xxx.xxx.xxx/test.cgi" method="post"> <input type="hidden" name="param1" value="dummy"> </form> このようなタグのあるHTMLを表示して、 JavaScriptでonLoadでsubmitすればできるのですが、 JavaScriptを使っているとSSLの場合にセキュリティのアラートがでる場合があるので、 できればPerlだけでできないかと思ったのです。

  • 文字列置換の方法

    下記の長い文字列をエディタで置換したいのですが、長くなると置換できません。このような長い文字列(?)は一般的なエディタでは置換できないものなのでしょうか。 【置換前】 <FORM ACTION="cargo.cgi" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded"> 【置換後】 <FORM ACTION="cargo.cgi" METHOD="POST">