質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IIS 7

IIS(インターネットインフォメーションサービス) 7は、 Microsoftによって開発された、Windowsの標準ウェブサーバーです。Window Server 2008 と Windows Vista向けにリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ASP

ASP(Active Server Pages) あるいはClassic ASP (ASP Classic)は、マイクロソフト社開発した動的なウェブページ製作に利用可能なサーバー側のスプリクトエンジンです。

Q&A

解決済

2回答

9051閲覧

クラシックASPプログラムで作成したWebページから圧縮ファイルをダウンロードしたい

t_tanaka020

総合スコア13

IIS 7

IIS(インターネットインフォメーションサービス) 7は、 Microsoftによって開発された、Windowsの標準ウェブサーバーです。Window Server 2008 と Windows Vista向けにリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

ASP

ASP(Active Server Pages) あるいはClassic ASP (ASP Classic)は、マイクロソフト社開発した動的なウェブページ製作に利用可能なサーバー側のスプリクトエンジンです。

0グッド

1クリップ

投稿2016/09/01 04:38

編集2016/09/02 05:40

###前提・実現したいこと
クラシックASP(.netではない)で、リンクをクリックするとzipファイルなどの
圧縮形式ファイルをダウンロードできるWebページを作成しているのですが、
圧縮形式ファイルをファイルとして認識してくれないらしく、ダウンロードに失敗します。
ダウンロードできるようにするにはどうすればよいでしょうか

###発生している問題・エラーメッセージ
IISの設定か、もしくはサーバーそのものの設定が問題なのではないかとは思うのですが・・・

追記:
沢山のご回答誠にありがとうございます。
言葉足らずで申し訳ございません。追記させていただきます。

ASPプログラム内で、ファイルシステムオブジェクトのIsFolderを使用して
選択したリンクがファイルかフォルダかを判断しています。
デバッグしてみると、選択したzipなどの圧縮ファイルはtrue(フォルダ)として
扱われてしまっております。
また、圧縮ファイルが置いてあるフォルダ内のファイル一覧をプログラム内で表示させてみると、
zipなどの圧縮ファイルは拡張子が表示されません。
おそらく、拡張子が表示されるようになれば、問題がなくなると思うのですが・・・

###試したこと
IISの「MIMEの種類」に.zipや.lzhが含まれていることは確認してあります。

###補足情報(言語/FW/ツール等のバージョンなど)
サーバーはWindowsServer2012R2、IISは8.5です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/09/01 04:52

ダウンロードしたいファイルは公開フォルダ内においてあるファイルでしょうか。 それともプログラム的に生成するものでしょうか。 また、「ダウンロードに失敗」の部分をもう少し何が起こるのか(エラーメッセージなど)を書いていただけますか。
t_tanaka020

2016/09/01 05:50

ファイルは、公開フォルダ内に置いてあるファイルとなります。
mit0223

2016/09/01 06:08

上のコメントにもありますが、「ダウンロードに失敗」というのは具体的にどのような現象になるのでしょうか?あと、ブラウザの開発ツールでネットワークをトレースし、ダウンロードリクエストに対するレスポンスのヘッダーをキャプチャできますか?できれば、HTTPの status コードや Content-Type ヘッダーの値などを教えてください。
kaz.Suenaga

2016/09/01 07:11

追記されたあたりの処理のソースコードを質問内にコードブロックとして貼り付けることはできませんか。 上記のような内容であれば、意図とソースコードが一致していない可能性があります。
t_tanaka020

2016/09/01 08:04

twckさん、ご回答ありがとうございます。 記述いただいたエクスプローラーでファイルの拡張子が表示されるようにする作業は既に完了しております。拡張子が表示されないのは、あくまでASPプログラム内での話です。 1.zipファイルのサイズは200KBくらいです。ちなみにIISのASP設定の  「最大要求エンティティボディ制限」は25MBにしてあります。 2. .xls、.xlsx、.doc .docx、.pdf、.ppt、.pptxなど、圧縮形式のもの以外は  ダウンロード可能です。 3. 直接ファイルを示しています。 4. Response.BinaryWriteを使用していますが、フォルダ扱いされる為ダウン  ロード用のプログラムに遷移してくれないので、問題解決には関係ないと   思います。 5. 「フォルダ情報が取得できない」と言われます。
guest

回答2

0

ベストアンサー

Scripting.FileSystemObject の IsFolder は zipをフォルダ扱いしてしまう仕様なので特に問題はありません。
↑訂正:Scripting.FileSystemObjectではなくShell.Applicationでした
IISやASPはzipを正しくファイル扱いするはずです。

エクスプローラーでファイルの拡張子が表示されるようにするには以下のようにします。
Windowsの[コントロールパネル]を開く。
->[フォルダーオプション]を開く。
->[表示]タブをクリックする。
->[登録されている拡張子は表示しない]のチェックを外す。
ただし、おそらく表示されるようになっても問題は解決しません。

そのうえで質問です。
(上の「情報の追加・修正の依頼をする」にも書きましたが改行されなくて見づらいので、こちらの回答欄で質問させていただきます。)

1.zipファイルのファイルサイズを教えてください。

2.zipファイル以外のファイルはダウンロードできますか?
できるのであればその拡張子をいくつか教えてください。

3.ダウンロードするリンクは以下のような感じで直接ファイルを示しているのでしょうか?
http://domain/folder/file.zip

それとも以下のような感じでASPのクエリーとしてファイル名を指定しているのでしょうか?
http://domain/folder/download.asp?f=file.zip

4.ASPでダウンロードの制御をするときに、以下のもので使用しているものはありますか?
Response.WriteFile
Response.BinaryWrite
Server.Transfer
ADODB.Stream

5.ダウンロードに失敗時に表示されているメッセージを教えてください。

投稿2016/09/01 07:46

編集2016/09/02 03:06
twck

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_tanaka020

2016/09/01 08:09

twckさん、ご回答ありがとうございます。 記述いただいたエクスプローラーでファイルの拡張子が表示されるようにする作業は既に完了しております。拡張子が表示されないのは、あくまでASPプログラム内での話です。 1.zipファイルのサイズは200KBくらいです。ちなみにIISのASP設定の「最大要求エンティティボディ制限」は25MBにしてあります。 2. .xls、.xlsx、.doc .docx、.pdf、.ppt、.pptxなど、圧縮形式のもの以外はダウンロード可能です。 3. 直接ファイルを示しています。 4. Response.BinaryWriteを使用していますが、フォルダ扱いされる為ダウンロード用 のプログラムに遷移してくれないので、問題解決には関係ないと思います。 5.「フォルダ情報が取得できない」と言われます。
twck

2016/09/01 10:18

なるほど、ダウンロード用のプログラムではなく、リンクを作るプログラムに問題があるのですね? では質問を追加させてください。 6.作られたリンクの Aタグ を見せてもらえますか? 7.リンクを作るときに Scripting.FileSystemObject を使っていますか? 8.差支えなければリンクを作る辺りのソースを見せてください。
twck

2016/09/01 10:50

間違えていたので訂正。 zipをフォルダ扱いしてしまうのは Scripting.FileSystemObject ではなく Shell.Application でした。 確かに Shell.Application を使ってファイル名を取得したら拡張子が消えていました。 というわけで、リンクを作るときのファイル名の列挙をするときは Scripting.FileSystemObject を使用してみたらいかがでしょうか? Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim folder Set folder = fso.GetFolder(パス名) Dim file Dim filenames filename = "" For Each file In folder.Files filenames = filenames & " " & file.Name Next
t_tanaka020

2016/09/02 02:27

twckさん たびたびご回答誠にありがとうございます。 確かにFileSystemObject ではなく Shell.Application です。間違えておりました。 申し訳ございません。 実を申し上げますと、サーバ(WIN2000)が老朽化の為、システムを 新サーバ(WIN2012)にそのまま移設することになり、この問題に直面しております。 完璧なソースは業務上大変差し支えがあるので公開できないのですが、 おおざっぱなものとしては、 Dim objApl Dim objFys Dim objDir Dim objDirItems Dim i Dim objItem Set objFys = CreateObject("Scripting.FileSystemObject") Set objApl = Server.CreateObject("Shell.Application") Set objDir = objApl.NameSpace(ディレクトリ名) Set objDirItems = objDir.Items() For i = 0 To objDirItems.Count - 1 Set objItem = objDirItems.Item(i) If objItem.IsFolder Then フォルダの場合のリンク表示 Else ファイルの場合の場合のリンク表示 End If Next となります。 試しにWIN2000サーバでもWIN2012でも Response.WriteでobjDirItems.Item(i)を表示させてみましたが、 結果は一緒だったので、 恐らく拡張子が表示されるされないの問題でもないような気がします。 ただ、WIN2000サーバではIsFolderでzipファイルをファイルとみなしてくれるので、 やはりWIN2012サーバは何か設定足りないのではと思うのですが・・・ また、他のサイトをみると、 「WIN2000環境で、ZIPFLDR.DLLをレジストリ登録しましたか?」 というような書き込みがありました。 WIN2012サーバでも同様のことを行なう必要があるのでしょうか。
twck

2016/09/02 03:02

ZIPFLDR.DLL はZIPをフォルダとして扱うものらしいので、逆にレジストリから削除するとうまくいくような気がします。 でも Shell.Application を使わなければ良いだけなので、Scripting.FileSystemObjectだけを使ってみたらどうでしょうか? とりあえず提示していただいたソースを元に変更してみました。 Dim objApl Dim objDir Dim objDirItems Dim objFileItems Dim i Dim objItem Set objFys = CreateObject("Scripting.FileSystemObject") Set objDir = objFys.GetFolder(ディレクトリ名) Set objDirItems = objDir.SubFolders For i = 0 To objDirItems.Count - 1 Set objItem = objDirItems.Item(i) フォルダの場合のリンク表示 Next Set objFileItems = objDir.Files For i = 0 To objFileItems.Count - 1 Set objItem = objFileItems.Item(i) ファイルの場合の場合のリンク表示 Next
t_tanaka020

2016/09/02 07:37

twckさん たびたびご回答誠にありがとうございます。 作成していただいたソースを実装してみました。 ※権限がなくて、dllはレジストリから削除できませんでした。 結果は、Set objItem = objDirItems.Item(i)のところでエラーになりました。 その前のobjDirItems.Count をデバッグしてみたところ、フォルダ数が 正しくとれました。何か問題があるのでしょうか?
twck

2016/09/02 08:30

ああ、すみません。ASPの実行環境がないため動作確認してませんでした。 SubFolders と Files はインデックスによるアクセスが出来ないんですね。 今、知りました。 というわけで For Each を使用して以下のようになります。 Dim objFys Dim objDir Dim objItem Set objFys = CreateObject("Scripting.FileSystemObject") Set objDir = objFys.GetFolder(ディレクトリ名) For Each objItem In objDir.SubFolders フォルダの場合のリンク表示:フォルダ名は objItem.Name で取得 Next For Each objItem In objDir.Files ファイルの場合のリンク表示:ファイル名は objItem.Name で取得 Next
t_tanaka020

2016/09/03 01:54

twckさん 修正誠にありがとうございます。実装してみたところ、できました!!!! 本当に助かりました。ありがとうございました!!!勉強になりました! ちなみに、そのままのロジックで移設するには、DLLを削除しなければ無理そうです。
guest

0

ソースが無いので具体的な回答は難しいですが・・・

先ず、対象ファイルの圧縮(zip生成)には成功しているという理解で合っていますか?

もしそうなら、「サーバー上で動的に生成したファイル」のダウンロードが上手く行かないということなので、下記ページのサンプルを参考にしてみてはいかがでしょうか。
(既に参照済みならゴメンナサイ。また、手元にテスト環境が無いので未検証であることもお伝えしておきます。)

03-04 ファイルダウンロード(ADODB.Stream)

以上、ご参考まで。

投稿2016/09/01 05:05

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_tanaka020

2016/09/01 05:57

ご回答ありがとうございます。 「サーバー上で動的に生成したファイル」のダウンロードではなく、公開フォルダ内に置いてあるファイルのダウンロードになります。 また、せっかく貼っていただいたリンクですが、会社のパソコンからなのでブロックされてみることができません・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問