- PR -

ファイル名を変更して保存するには?

1
投稿者投稿内容
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-05-06 14:16
こんにちはnabeママです。連休が終わりましたね。

POSTされたファイルを入出力ストリームで任意のディレクトリに保存させる時に、
ファイル名を変更して保存させるにはどうすればいいでしょうか?
ファイルの種類はいろいろです。テキストあり、EXCELあり、WORDあり、画像ありと・・・

renameToで抽象パス名の変更ができそうなのですが、ファイルの拡張子がバラバラなのでどう書けばいいのか・・・

よろしくお願いします。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-05-06 15:46
引用:

nabeママさんの書き込み (2003-05-06 14:16) より:
こんにちはnabeママです。連休が終わりましたね。

POSTされたファイルを入出力ストリームで任意のディレクトリに保存させる時に、
ファイル名を変更して保存させるにはどうすればいいでしょうか?
ファイルの種類はいろいろです。テキストあり、EXCELあり、WORDあり、画像ありと・・・

renameToで抽象パス名の変更ができそうなのですが、ファイルの拡張子がバラバラなのでどう書けばいいのか・・・

よろしくお願いします。


これはファイルのアップロード時に、
名前を変更したいと解釈して宜しいのでしょうか?
少なくとも、私にはそう取れてしまうのですが。
もしそうなら、
サーバー上にファイルを作成した後に、
FileクラスのrenameToで名前を変更するよりは、
リクエストから取得したファイル名の拡張子+任意の文字列で、
サーバー上にファイルを作成する方が良いです。
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-05-06 16:20
[/quote]
これはファイルのアップロード時に、
名前を変更したいと解釈して宜しいのでしょうか?
少なくとも、私にはそう取れてしまうのですが。
もしそうなら、
サーバー上にファイルを作成した後に、
FileクラスのrenameToで名前を変更するよりは、
リクエストから取得したファイル名の拡張子+任意の文字列で、
サーバー上にファイルを作成する方が良いです。
[/quote]

takuさんありがとうございます。
takuさんの解釈どおりでいいのですが、リクエストから取得したファイル名の拡張子は
どうやって取得できますか?
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-05-06 16:34
引用:

takuさんの解釈どおりでいいのですが、リクエストから取得したファイル名の拡張子は
どうやって取得できますか?


アップロード時にストリームの解析はどのようにされているのでしょうか?
ストリームをご自分で解析されているのなら解るはずなんですが。
※下記参照
http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/programming/howtoupload.html

なにかアップロード解析モジュールを使用されているのでしょうか?
もしそうなら、ファイル名取得用のメゾットが用意されているはずです。
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-05-06 17:14
takuさん何度もすみません。

次の通りです。本を見て真似たので見当違いかも知れませんが・・・

//送信されたフォーム名と値を取得
Enumeration en = request.getParameterNames();
 while ( en.hasMoreElements() ){
  String GetName = (String)en.nextElement();
  String GetAllValue[] = request.getParameterValues(GetName);
   if (GetName.equals("GFile")){
    for (int i=0; i<GetAllValue.length; i++){
     String GetValue = new String(GetAllValue[i].getBytes("8859_1"), "JISAutoDetect");
     File InFile = new File(GetValue);
     if (InFile.exists() && InFile.isFile() && InFile.canRead() ){
      try {
       File OutFile = new File("D:/DATA/" + InFile.getName());
       FileInputStream InF = new FileInputStream(InFile);
       FileOutputStream OutF = new FileOutputStream(OutFile);
       int contents;
       while ((contents = InF.read()) != -1) {
        OutF.write(contents);
       }
       InF.close( );
       OutF.close( );
      } catch (IOException e){
       out.println(e);
       e.printStackTrace();
      } finally {}
     }
}
}
}

この方法でd:\dataという任意のフォルダにPOSTされたファイル名で保存できてます。
API仕様のfileクラスには拡張子の取得は見当たりません。

※下記参照・・・のRFC1867とかいうのでする方が簡単なんのでしょうか?
よく分かりません。よろしくお願いします。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2003-05-06 17:54
みーちくです。

ファイルのリストを取得する方法は、私もこの掲示板に質問しました。
下記を参照してみて下さいませ。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2467&forum=12
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-05-06 18:34
引用:

次の通りです。本を見て真似たので見当違いかも知れませんが・・・
この方法でd:dataという任意のフォルダにPOSTされたファイル名で保存できてます。
API仕様のfileクラスには拡張子の取得は見当たりません。

※下記参照・・・のRFC1867とかいうのでする方が簡単なんのでしょうか?
よく分かりません。よろしくお願いします。


提示されたソースですが、アップロードではありません。
アップロードのつもりなのかもしれませんが、アップロードになってないです。
提示されているソースですと、
ローカル環境では動作するかもしれませんが、
サーバー上に設置した場合に動作しません。

アップロードをする場合、
javax.servlet.ServletRequestのgetInputStream()で入力ストリームを取得します。
http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/ServletRequest.html#getInputStream()

このストリームにはファイル名やバイナリデータ、
その他のパラメーターがごちゃ混ぜになっています。
アップロードの肝はいかにしてこのストリームを解析するかにかかっています。
解析には先ほど提示したサイトのように独自ロジックを組む方法と、
JavaMailやjakartaプロジェクトの解析モジュールを使用する方法があります。

RFCが解らないところをみると、
HTTPやWEBというものを理解しないで、やられているようですね。
サーバーサイドの場合、こういった知識は必須です。
Javaよりもまず、こちらをしっかりと勉強してください。
nabeママ
常連さん
会議室デビュー日: 2003/04/11
投稿数: 39
投稿日時: 2003-05-07 08:55
おはようございます。nabeママです。
takuさんみーちくさんありがとうございます。

takuさんには痛いところをつかれてしまって・・・
他の質問でも同じ指摘があってつらいところですが、実践しながら勉強をしている
次第です。
とりあえず今の仕事を完成させて、きちっと勉強してもう一度ソースを見直おそうと思ってます。(なんせ期限が間近ですから)

書いていただいた参照とかを見て勉強します。
ありがとうございました。
1

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