TIdMultiPartFormDataStreamを使ってSHIFTJISでサーバーにPOSTする際に文字化けしないようにするには

解決


さまよう猫  2012-01-26 14:35:26  No: 41511  IP: [192.*.*.*]

WindowsXP、Delphi2010にてIndy10を使い
アップローダーにファイルをアップロードするプログラムを作成しております。

ファイルとそのファイルに対するコメントを設定して送信するのに
TIdMultiPartFormDataStreamを使って送信しておりますが、
アップロード先の受け入れコードがSHIFT-JISのため、
全角文字を使うとコメントが文字化けしてしまいます。
(アップロード前のオリジナルのファイル名も全角が含まれると文字化けする)

Delphi2010のstringがUniCodeになったことで
SHIFT-JISに変換しなくてはいけないのだろうということは想像付くのですが、
具体的な方法がいまいちわからずに苦労しております。

TIdMultiPartFormDataStreamを使わない方法でも構わないので
何かヒントをいただけたらと思い書き込みました。ご教授いただけないでしょうか。

編集 削除
Mr.XRAY  2012-01-27 01:29:00  No: 41512  IP: [192.*.*.*]

こんにちは.Mr.XRAYです.

var
  DataStream : TIdMultiPartFormDataStream;
  
  DataStream := TIdMultiPartFormDataStream.Create;   
  try
    DataStream.AddFile('UpdataFiles', ファイル名1, ファイル名2, ファイル名3);  
    IdHTTP1.Post(UPLoadURLPage, DataStream);
  finally  
   DataStream.Free;      
  end;
  
のようにUPLoaadしたのでしょうか.
そのファイルの内のどれかがテキスト形式のファイルだった,ということでしょうか.

で,どうして文字化けすると分かったのでしょうか.
サーバの中に入り込んで確認したとか(笑.冗談です).


>(アップロード前のオリジナルのファイル名も全角が含まれると文字化けする)

ということはありますね.

手前みそですが,参考記事です.

[06_ファイル名が日本語のファイルをアップロード] 
http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm#06

[08_日本語のディレクトリ名やファイル名の扱い] 
http://mrxray.on.coocan.jp/Delphi/plSamples/774_Indy_FTPDirFileList.htm#08

では,頑張ってください.さようなら.

編集 削除
さまよう猫  2012-01-27 17:13:12  No: 41513  IP: [192.*.*.*]

X-RAYさんこんにちは、コメントありがとうございます。
X-RAYさんのHP、ちょくちょく拝見させて参考にさせて頂いております。

今回の件ですが、

var
  DataStream : TIdMultiPartFormDataStream;
  Comment : string;
  ContentType : string;
begin
  DataStream := TIdMultiPartFormDataStream.Create;   
  try
    Comment:=Edit1.text;
    IdHTTP1.Request.CharSet := 'Shift_JIS';
    DataStream.AddFile('UpdataFiles', ファイル名1, ContentType);  
    DataStream.AddFormField('comment' , Comment , 'Shift_JIS');
    IdHTTP1.Post(UPLoadURLPage, DataStream);
  finally  
   DataStream.Free;      
  end;
end;

とした時に、Commentが文字化けしちゃうんです。

仮にコメントを「かります」として送信したとすると、
相手先のアップローダー上では「=82=A9=82=E8=82=DC=82=B7」などと表示されてしまいます。

ここでIdHttp1に自動でエンコードさせないようにすると
当然Unicodeのままなのでこれも文字化けしてしまいます。

アップローダーはsn uploaderというものを使っているようです
http://sugachan.dip.jp/obsolete/snup/
参考までにsn uploaderを使ったアップローダーの例
http://imas.ath.cx/~imas/cgi-bin/pages.html

ファイル名の文字化けはIdMultiPartFormStreamのAddFileが
ファイル名にstring型の引数を取るためこれをAnsiString型の引数で
受けとるようにソースを書き換えないといけないのでしょうか。

編集 削除
DEKO  2012-01-27 18:46:41  No: 41514  IP: [192.*.*.*]

> 相手先のアップローダー上では「=82=A9=82=E8=82=DC=82=B7」などと表示されてしまいます。
Indy 10 の TIdMultiPartFormDataStream.AddFormField() は、常に Quoted-Printable でエンコードします。
サーバー側が Quoted-Printable をデコードできない仕様だと、今回のような事になります。

解決方法ですが、
・最新版の Indy をインストール
・ContentTransfer := '8bit'; を指定する。
  (トランスファエンコーディングを行わないように指定)
この 2 点が必要です。

詳しくは以下のサイトを参考にして下さい。

[Delphi Indy Send POST data in Cyrillic (Stack Overflow)]
http://stackoverflow.com/questions/6750222/delphi-indy-send-post-data-in-cyrillic

編集 削除
さまよう猫  2012-01-27 21:05:05  No: 41515  IP: [192.*.*.*]

DEKOさん、コメントありがとうございます。

ご指摘の通り最新版のIndyをインストール後、
ContentTransfer:='8bit';を付け加えることで無事文字化けを防ぐことができました!

X-Rayさん、Dekoさんお二方のおかげで他に抱えていた問題も解決でき大変助かりました。
本当にありがとうございました。

編集 削除
さまよう猫  2012-01-27 21:06:55  No: 41516  IP: [192.*.*.*]

あ・・・Mr.XRAYさんのお名前を間違えておりました。
Mr.XRAYさん、申し訳ありません。

編集 削除