WindowsXP、Delphi2010にてIndy10を使い
アップローダーにファイルをアップロードするプログラムを作成しております。
ファイルとそのファイルに対するコメントを設定して送信するのに
TIdMultiPartFormDataStreamを使って送信しておりますが、
アップロード先の受け入れコードがSHIFT-JISのため、
全角文字を使うとコメントが文字化けしてしまいます。
(アップロード前のオリジナルのファイル名も全角が含まれると文字化けする)
Delphi2010のstringがUniCodeになったことで
SHIFT-JISに変換しなくてはいけないのだろうということは想像付くのですが、
具体的な方法がいまいちわからずに苦労しております。
TIdMultiPartFormDataStreamを使わない方法でも構わないので
何かヒントをいただけたらと思い書き込みました。ご教授いただけないでしょうか。
こんにちは.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
では,頑張ってください.さようなら.
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型の引数で
受けとるようにソースを書き換えないといけないのでしょうか。
> 相手先のアップローダー上では「=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
DEKOさん、コメントありがとうございます。
ご指摘の通り最新版のIndyをインストール後、
ContentTransfer:='8bit';を付け加えることで無事文字化けを防ぐことができました!
X-Rayさん、Dekoさんお二方のおかげで他に抱えていた問題も解決でき大変助かりました。
本当にありがとうございました。
あ・・・Mr.XRAYさんのお名前を間違えておりました。
Mr.XRAYさん、申し訳ありません。