- PR -

Struts uploadでファイル名文字化け

1
投稿者投稿内容
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2003-04-30 23:21
はじめまして、どうぞよろしくお願いいたします。
早速ですが、
StrutsでFormFileを用いてuploadを行っていて、
日本語のファイル名を入れると
以下の文字が入るとファイル名がおかしくなります。
ソ、構、十、申、能、暴・・・
FormFile.getFileName()で取得したファイル名は
これらの文字から前(この文字を含む)の文字列がカットされています。
2バイト目が0x5cであることが原因であることはわかっています。
しかし、FormFile.getFileName()で取得した時点で
文字列がなくなっているのでエスケープしようにもできません。
このような問題を解決した方がいらっしゃるのであれば
対処法をおしえていただけませんでしょうか。
よろしくお願い致します。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-01 13:50
MultipartBoundaryInputStreamでファイル名の取得の時にコードページを指定していないので、そういった現象になると思います。

RFCでもファイル名に2バイトコードを入れてはいけないという規約があるようですので、
実装としては間違ってないのですが・・・

ブラウザは何も考えずに2バイトコードを入れてくる物もあると思いますので、
自分でServletAPIでゴリゴリ書くか、Strutsのコードを書き換えるしかないと思います。

それか・・対応したStrutsがリリースされるのを待つ???

あとは、望みは薄いですがJVMの環境変数としてdefaultデコーディングを指定するとか・・・
palmnet
会議室デビュー日: 2003/05/01
投稿数: 3
投稿日時: 2003-05-01 18:08
jakarta-commonsのfileuploadのNightlyBuildでは改善されているようです。
commons-fileupload.jarを置き換えればよいと思います。
以下の場所よりバイナリがダウンロードできます。

http://cvs.apache.org/builds/jakarta-commons/nightly/commons-fileupload/
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-01 18:27
参照実装として使えるとは思いますが、
commonsのfileupload自体betaですのでお勧めしませんでした。
また、NightlyBuildをお遊びとプロジェクト参加以外で利用する人を
私は信用できません。

Strutsもfinalリリースしたものに自分でパッチすることをお勧めします。
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2003-05-01 22:23
皆さんありがとうございます!

これを用いているのは実際のプロジェクトでこの機能以外は完成しています。
ですのでStrutsのコードを書き換えるしかないのでしょうか。
上司と相談してみます・・・。

今日は会社でStrutsのソースを見て
どこでファイル名がカットされているのか調べてました。
lastIndexOf("\\")(MartipartIterator.java)というところが問題だと思うのですが
その前でエスケープをすればいいのでしょうか?
Strutsのコードを書き換えるとして、
教えていただけますでしょうか?
あつかましく何度も質問してすみません。

よろしくお願い致します。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-02 14:27
lastIndexOf("\\")(MartipartIterator.java)
が見当たらなかったんですが・・見てるソースが違うのかな・・・
バージョンとビルドを・・・

そもそも其処じゃないってのもあるんですが・・・
MultipartBoundaryInputStream#readLine()のnew String()でエンコード指定して
fillLineBuffer()でSJISコードだったらエスケープ処理を追加するような感じでしょうか。
InputStream#read()を使ってるところが厄介ですね。

あたりも付かないようだと、ソースを触るのは無理かと・・・
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2003-05-02 21:11
zaxx_MDさん、何度もありがとうございます。
Strutsのバージョンは1.0.2です。(今更ですけど・・・申し訳ありません)

lastIndexOf・・・ですが、仕事の合間にチラッと見ただけでしたので
早とちりしてしまいました。

>MultipartBoundaryInputStream#readLine()のnew String()でエンコード指定して
>fillLineBuffer()でSJISコードだったらエスケープ処理を追加するような感じでしょうか。
>InputStream#read()を使ってるところが厄介ですね。

以上を参考にいじってみます。
有難うございます。
1

スキルアップ/キャリアアップ(JOB@IT)