- PR -

IEのダウンロード画面を多重起動

投稿者投稿内容
あめみ
会議室デビュー日: 2006/06/06
投稿数: 2
投稿日時: 2006-06-06 12:04
以前同じ現象に悩んだことがあります。
その際は処理を受け持つサーブレットの名称を Javascript で毎回変えることで
対処しました。
やり方としましては web.xml に

コード:
  <servlet>
    <servlet-name>view</servlet-name>
    <servlet-class>hoge.FileViewServlet</servlet-class>
    <init-param>
    ..........
    </init-param>
  </servlet>

  <servlet-mapping>
	<servlet-name>view</servlet-name>
	<url-pattern>*.view</url-pattern>
  </servlet-mapping>



などとしておき、呼び出す際に *.view の * の部分を Javascript で動的に変更
します (abcde.view とか sikge.view とか.....)。
こうすると * の部分が毎回変わりキャッシュファイル名が重複することが無くなる
ため、同じファイルでも正常に開くことが可能になります。
なんかダサい方法ですがこんな感じで一応問題解決はしました。
ご参考までに。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-06 22:28
 私なら、他のブラウザで同じように動かして、どうなるか確認します。

 なんにしても、ブラウザの中に OLE オブジェクトを埋め込んで見せてくれるのは、IE だけの特殊仕様ですから、それに依存するような使い方は、運用で回避してもらいます。
 つまり、「IE で見ることができる」のではなく、「IE だと、運良く見ることができる、かもしれない」という仕様にします。

 それを営業に説明できるのがエンジニアであり、顧客に納得してもらうのが営業の仕事だと思います。
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2006-06-08 00:39
お世話になっております。

引用:

 私なら、他のブラウザで同じように動かして、どうなるか確認します。

 なんにしても、ブラウザの中に OLE オブジェクトを埋め込んで見せてくれるのは、IE だけの特殊仕様ですから、それに依存するような使い方は、運用で回避してもらいます。
 つまり、「IE で見ることができる」のではなく、「IE だと、運良く見ることができる、かもしれない」という仕様にします。



確かに、Jittaさんのおっしゃるとおりだと思います。
現在は運用で回避する方向で考えておりました。

引用:

 それを営業に説明できるのがエンジニアであり、顧客に納得してもらうのが営業の仕事だと思います。



説明するのにも、確かな証拠というものがないと証明できません。
なので、MSDNでくまなくこの現象について調査しておりました。
まだまだ未熟ではありますが、Jittaさんのおっしゃることを
改めて肝に銘じておこうと思います。
ブラウザについてですが、IEのみと決まっているため、
また開発環境は外部と一切のネットワークがないため
IE以外のブラウザでの調査は、環境的にできませんでした。
毎日自宅で回答しておりまして、いつも回答遅れることも
申し訳ないと思っています。

>あめみさん

技術的に可能なことも改めて、調査する方向にすることとしたいので
もう少し詳しく教えていただけないでしょうか。
現状の開発環境では、TomCat5.0、JDK1.4.2を使用して開発しております。
Javascriptでサーブレットクラスをwindow.openでコールして、
サーブレットクラスで、setheaderメソッドを使用してcsvファイルを出力しています。
setHeader("Cache-Control","");
setHeader("Pragma","");
setHeader("Content-disposition","inline; filename="ファイル名を予め変数に格納");

上記のようなsetheaderをコーディングしております。
そして、当サーブレットクラスをweb.xmlにて、マッピングしております。
マッピングの方法については、当サーブレットクラスのIDを記述しています。
あめみさんのおっしゃるような設定方法のみで、解決できますでしょうか。
今一度、ご回答のほどお願い致します。

あめみ
会議室デビュー日: 2006/06/06
投稿数: 2
投稿日時: 2006-06-08 14:31
こんにちは。詳しくということですので少々長くなりますが web.xml、jsp、servlet
を書いておきます(さっきお昼休みに作ったのでかなりてきとーです^^

web.xml
コード:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    
  <display-name>FileViewTest</display-name>
  
  <context-param>
    <param-name></param-name>
    <param-value></param-value>
  </context-param>
  
  <servlet>
    <servlet-name>view</servlet-name>
    <servlet-class>FileViewServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>view</servlet-name>
	<url-pattern>*.view</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
	<servlet-name>invoker</servlet-name>
	<url-pattern>/servlet/*</url-pattern>
  </servlet-mapping>
  
  <session-config>
	<session-timeout>20</session-timeout>
  </session-config>
  
  <welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>



index.jsp
コード:
<%@ page contentType="text/html; charset=Windows-31J" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<meta http-equiv="pragma" content="no-cache">
<title>ファイル表示テスト</title>
<script type="text/javascript">
	function view(fileName)
	{
		var winName = getRandomName(5);
		var url     = winName + '.view?fileName=' + fileName;
		var win     = window.open(url, winName);
	}
	
	function getRandomName(num)
	{
		var name = '';
		var salt = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 
			'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
			'y', 'z' ];

		for (var i = 0; i < num; ++i)
		{
			name += salt[Math.floor(Math.random() * 25)];
		}
		return name;
	}
</script>
<style type="text/css">
	.title
	{
		background-color: #000000; 
		color           : #ffffff;
		font-size       : 12px;
		padding         : 5px;
		width           : 400px;
	}
	.content
	{
		border       : 1px solid #000000;
		font-size    : 12px;
		margin-bottom: 20px; 
		padding      : 5px;
		width        : 400px;
	}
</style>
</head>

<body>

<div class="title">従来: 同じリンクを 2 度クリックすると、最初のウィンドウが真っ白になる</div>
<div class="content">
<a href="javascript:void(0);" onClick="window.open('aaa.view?fileName=a.csv');">a.csv</a> 
<a href="javascript:void(0);" onClick="window.open('aaa.view?fileName=b.csv');">b.csv</a>
</div>

<div class="title">改良: 従来の問題を解消したもの</div>
<div class="content">
<a href="javascript:void(0);" onClick="view('a.csv');">a.csv</a> 
<a href="javascript:void(0);" onClick="view('b.csv');">b.csv</a>
</div>

</body>
</html>



servlet
コード:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileViewServlet extends HttpServlet
{
	public void doGet(HttpServletRequest req, HttpServletResponse res)
	{
		doCommon(req, res);
	}
	
	public void doPost(HttpServletRequest req, HttpServletResponse res)
	{
		doCommon(req, res);
	}
	
	public void doCommon(HttpServletRequest req, HttpServletResponse res)
	{
		String fileName = req.getParameter("fileName");
		String path     = getServletContext().getRealPath(fileName);
		
		try
		{
			ServletOutputStream sos = res.getOutputStream();
			
			res.setBufferSize(1024);
			res.setContentType("application/octet-stream; charset=Shift_JIS");
			res.setHeader("cache-control", "");
			res.setHeader("pragma", "");
			res.setHeader("content-disposition", "inline; filename=" + fileName);
			
			sos.write(readFile(path));
			sos.flush();
			sos.close();
		}
		catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	private byte[] readFile(String path) throws FileNotFoundException, IOException
	{
		File file             = new File(path);
		byte[] data           = new byte[(int) file.length()];
		FileInputStream input = new FileInputStream(file);
		input.read(data);
		input.close();
		
		return data;
	}
}



で、index.jsp と同階層に a.csv と b.csv という CSV ファイルを 2 つおいて
ください。中身はなんでもいいです。
私の環境 (Linux、Tomcat5.0.28、js2dk1.4.2) では正常に動いてました。
では。ノ
effemia
常連さん
会議室デビュー日: 2005/04/05
投稿数: 34
お住まい・勤務地: 札幌
投稿日時: 2006-06-13 17:43
お世話になります。
多忙に付き、大変遅くなりまして、申し訳ございません。

あめみさんのおっしゃるとおりのソースを埋め込んだところ
成功しました。
多重起動も成功しましたので、当開発環境での検証をし
ユーザ要件的に問題無いか等も調査した結果、問題も特に見当たらなかったのですが
Webで表示する上で、当処理をすることによって
一般的な矛盾点等ありますでしょうか。
検証した結果では特になかったため、ご教授のほどお願い致します。
ちなみに、検証は以下の通り行いました。
・同一CSV多重起動
・異なるCSV多重起動
・その他のOfficeファイルで上記の同様の検証

以上、ご回答のほど宜しくお願い致します。
返答のほう遅くなって申し訳ありませんでした。

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