[PHP-users 18374]ファイルダウンロードで「開く」のみ失敗する

Hiroaki Arakawa arakawa @ softem.jp
2003年 10月 9日 (木) 14:39:01 JST


はじめまして。荒川と申します。

phpにおけるhttpヘッダを利用したダウンロードに関して
どうしてもうまくいかずこちらに質問させていただいた次第です。

webアプリ上の掲示板においてファイルのアップロード&ダウンロード
を行いたいのですが、ダウンロードの方がうまくいきません。

設計としてはアップロードされたファイルを指定されているフォルダに
一括保存し、掲示板に表示されているリンクをクリックすると
ファイルがダウンロードされるという仕組みです。

アップロードされたファイルはユニークなファイル名に変更した状態
でフォルダに保存され、ダウンロード時に本当のファイル名をDBに問い合わせ
ダウンロードするという手順となっております。

ダウンロードを開始するとファイルを「開く」か「保存する」ダイアログが表示
されますが、その際に「開く」を選択するとそのファイルを開くアプリケーション側
でエラーが起こります。

テキストエディタでは
「ファイルが開けません。ファイル名が正しいか確認してください」

画像をIEで開こうとすると
「'file:///C:/Documents%20and%20Settings/×××.●●●/Local%20Settings/
Temporary%20Internet%20Files/Content.IE5/AD8BMJMN/icon_h_rewriteCol0%5B1%5D.
gif'
が見つかりません。パスまたはインターネット アドレスが正しいかどうかを確認し
てください。」

といったエラ−メッセージが表示されます。
ただし、「開く」「保存する」のダイアログで「保存する」を選択すると素直に
ダウンロードでき正しくファイルを開くことができます。
ファイル名も正しく表示されています。
ソースのダウンロード処理部分を下記に添付します。
どうかよろしくお願いします。

____________________________________________________________________________
________________
環境
サーバー    : windows2003 iis 6.0
PHP          : 4.3.2
クライアント : windows2003 IE 6.0
____________________________________________________________________________
_________________

 function download(){

 //リクエストからフォルダ内のファイル名(以下ファイルID)を取得
  $fileid = $_REQUEST["fileid"];

  //データベースアクセス用のオブジェクト生成
  $dao = new messageDAO();

 //データベースアクセスオブジェクトにファイルIDを引数とし、
  //ファイル名を問い合わせる
  $filename = $dao->fileidToFilename($fileid);

  //データベースに存在しない場合はfalseが返る
  //掲示板の登録確認画面(DB保存前)でもダウンロードの確認ができるため
  //セッションを確認する
  if(!$filename){

       if($_SESSION["message"]){
           $filename = $_SESSION["message"]->file_name;
       }
       else{
           trigger_error("ファイルエラー",E_USER_ERROR);
       }

  }

    //ファイルの容量取得
    $content_length = filesize("uploadfile/" . $fileid);

    //ダウンロード用ヘッダ
    Header("Content-disposition: attachment; filename= $filename");
    header("Content-Length: ".$content_length);
   header("Content-Type: application/octet-stream");

// Header("Content-disposition: inline; filename= test.txt");
// ->デバッグ(失敗)
// Header("Content-disposition: attachment; filename= test.txt");
// ->デバッグ(失敗)
// Header("Content-Type: content=text");
// -> デバッグ(失敗)


  //ダウンロードファイルを吐き出す
  readfile("uploadfile/" . $fileid);
//  readfile("test.txt");
// -> デバッグ(失敗)

  exit();
 }


お願いします。

------------------------------
荒川 ヒロアキ



PHP-users メーリングリストの案内