- PR -

改行コード,文字コードを考慮したダウンロードに関して

1
投稿者投稿内容
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-06-12 15:55
いつもお世話になっております。
教えて頂きたい事があります。

サーブレットを用いて、
WEBからSolarisサーバ上のテキストファイルをHTTPダウンロードさせております。

ファイルをダウンロードする際に、
テキストファイルをダウンロード先に適した形に整形し、
(【適した形】というのは、例えば、
 FTPダウンロードする場合を考えてみると、
 SolarisサーバからWindowsにテキストファイルやログファイルを、FTPダウンロードする際、
 ASCII、EUCと指定してダウンロードしてやれば、
 適切な改行コードが付加され、文字化けせずにメモ帳等でファイルを開く事が出来ますが、
 そういった形の事です。)
ダウンロードさせたいのですが、その方法が分かりません。

ダウンロード方法としては、以下のようなソースを使っていますが、
どの時点で、もしくは、どんな形のresponseを返してやれば、
その環境に適した形になるのでしょうか?
ご教授頂きたく思います。
環境:Solaris,WebSphere5.0
ダウンロードを実行する環境:Windows,Linux,Mac等々・・・

OutputStream out = null;
FileInputStream in = null;

try {
 File file = new File("c:/test.txt");
 long size = file.length();
 in = new FileInputStream("c:/test.txt");
 response.setContentLength((int)size);
 response.setContentType("application/octet-stream");
 response.setHeader("Content-Disposition", "attachment; filename=c:/test.txt");
 out = response.getOutputStream();
 int c;
 while ((c = in.read()) != -1) {
   out.write(c);
 }
 out.flush();
}
catch (FileNotFoundException e) {
}
catch (IOException e) {
}
finally{
 try {
  if (out!=null) {
   out.close();
 }
  if (in!=null) {
   in.close();
  }
 }
 catch (IOException ioe) {
 }
}

以上、宜しくお願い致します。
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-06-12 18:50
一応サンプルに作ったソースです。
Webではテストしていませんが同じような原理で変換できると思います。
ポイントはOutputStreamWriterで文字コードを指定しているところです。

import java.io.*;

public class EncodeTest
{
public static void main(String[] args){
String input = null;
String output = null;
String encode = null;
String buffer = null;
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;

try{
input = args[0];
output = args[1];
encode = args[2];
}catch(Exception e){
System.exit(1);
}

try{
fis = new FileInputStream(input);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);

fos = new FileOutputStream(output);
osw = new OutputStreamWriter(fos, encode);
pw = new PrintWriter(osw);

while((buffer = br.readLine()) != null){
pw.println(buffer);
}

pw.close();
osw.close();
fos.close();

br.close();
isr.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
}finally{
pw = null;
osw = null;
fos = null;
br = null;
isr = null;
fis = null;
}
}
}
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-06-14 14:23
おそらくこのサイトのどこかのコラムに解説がありそうな話ですが、一応。

Javaは、プロセス内部の文字コードを16ビットUnicode(UCS-2)で扱うという
原則があります。JVM上で正しく生成されているStringオブジェクトが所有す
る文字列は、すべて内部的にはユニコードで保存されています。

一方、JVMが起動しているマシンのOSは、それぞれのローカルな文字コードで
ファイルを保存しています。
WindowsならShift_JIS、UnixならEUC_JP、あるいはUTF-8を使用している場合
もあるでしょうか。

これにより、Java製のサーバを用いてサーバー側のローカルストレージ上のファ
イルを正しい文字コードでクライアントに転送するためには、
1.ローカルファイルの文字コード→16ビットUnicodeの変換をしてJVMのメモリ
上に置く
2.16ビットUnicode→クライアント環境ごとの適切な文字コードの変換をして
クライアント側に転送

の2つの作業を行わなければなりません。

そのうち、1の作業については、java.io.Readerが自動的に変換をしてくれる
ので、プログラマはこのクラスを使用してファイルを読むようにすること以外、
特に作業は必要ありません。(JVMがReaderに正しい文字コード変換ルールを
渡していないこともあるので、そのときはコンストラクタ引数等で明示的に渡
してやる必要があります。Linux版Javaでは、そういうことがよく起きるよう
ですね。)

2については、
2-1.クライアント側の文字コードが何なのかをサーバーで判断
2-2.1で得られた文字コードを用いて変換
という作業をする必要があります。

このうち2-2については、変換すべき文字コードがわかっているなら、java.io.
Writerを利用することで簡単に変換を実行することができるはずです。

問題は2-1です。これは何をもって知ることができるでしょうか?
HttpServletならば、HttpServeltRequestが持っているリクエストヘッダパラメ
ータ等である程度正しく判断できると思いますが、判断できる材料を得られるかど
うかは、クライアント側(ユーザーが使用しているWebブラウザ)の実装依存なの
ですよね・・・
このあたりはあまり詳しくないのですが、お分かりになる方はいらっしゃいますか?
1

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