aviファイルのダウンロードについて - PHPプロ!Q&A掲示板

3029

  • 0P

aviファイルのダウンロードについて

質問日時 / 2010年12月22日 22:09    回答数 / 4件

Questioner:  minak83  このエントリーをはてなブックマークに追加 

キーワード / ダウンロード    エラー処理   

環境PHP Version 5.3.1 
/IE8/OS windows7

お世話になっております。
ブラウザからaviファイルを選択してダウンロードしようとしています。
壊れたファイルなどをダウンロードしないように事前に回避する処理を
いれる方法がわかりません。submitやlocation.hrefでいろいろ試して
みましたがその後の挙動が変わってしまい困っています。

1)ダウンロードを実行するphp
download.php
<?php

$filepath="C:\\temp\\".$_REQUEST["filename"]; 

if (file_exists($filepath)==false){
return false;
}

$filesize = filesize($filepath);
if ($filesize == 0) {
return false;
}

$handle = fopen($filepath, "rb");
if ($handle==null){
return false;
}

$mime_type = mime_content_type($filepath);
header("Content-type: {$mime_type}");
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$filesize);

header("Expires: -1");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: private");

while (!feof($handle)) {
echo fread($handle, 4096);
flush();
ob_flush();
}
fclose($handle);
return true;

?>


2)ブラウザ側 main.php
location.href="submit_test.php?from=download&filename=test.avi";


3)ブラウザから呼び出されるphp
sumit_test.php
<?php

if ($_REQUEST["from"]==="download"){
$filepath="C:\\temp\\".$_REQUEST["filename"]; 
$sts=require_once("download.php");
if ($sts==false){
$err="失敗";
}else{
$err="";
}

}else if ($_REQUEST["from"]==="other"){

}
require("main.php");

?>

これだと中断しても"main.php"には戻りますが、そもそも正常にダウンロード
した場合はrequire("main.php"); は実行されていないようです。

(正常時は "main.php"が表示されたまま、ダウンロードのダイアログが表示されます。)


正常処理だけが続けば問題ありませんが、

不正ファイルのため処理を抜けた後に、正常ファイルをダウンロードすると
require("main.php");は実行されないので
"main.php"にセットした"失敗"のエラーメッセージが消えない他、
F5キーを押してブラウザをリロードするとダウンロードを開始してブラウザは
ブランクになってしまいます。

一度も中断処理を行わなければ、リロードしても元の画面のままです。
解決方法はありませんでしょうか?

よろしくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01win_php3)ブラウザから呼び出されるphp sumit_test.php
┃┗A01-1minak83回答ありがとうございます。 ユーザの操作が増えるで
┗A02pannnarequireは使わずリダイレクトすべきです。 また、
 ┗A02-1minak83回答ありがとうございます。 >また、正常にダウン

回答一覧

並び替え:

A01 参考になった
answererwin_php [12月23日 02:59]

3)ブラウザから呼び出されるphp
sumit_test.php

はタイプミスで submit_test.php だと推測されますが、

main.php の中身に
location.href="submit_test.php?from=download&filename=test.avi";

が書いてあるのですか?

submit_test.php に
require("main.php");

が記述されているのですよね?

現状がどうなのかわかりませんが、無限ループしませんか?
しないにしても、好ましくない書き方に思うのですが。

これだけだとよくわからないのですが、
submit_test.php で成功か、失敗かをきちんと分岐して
分岐した括弧内で、
成功の場合
header("Location: complete.php");
失敗の場合
header("Location: error.php");

みたいにページ移動させればよいのではないでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerminak83 [12月25日 18:57]

回答ありがとうございます。
ユーザの操作が増えるで別ページには移動したくないのです。移動できるようであれば不具合はでないのですが・・・
無限ループにはなりませんが、好ましくない呼び方だと思います。

この意見に回答する

ツリーへ TOPへ

A02 満足
answererpannna [12月24日 16:14]

requireは使わずリダイレクトすべきです。

また、正常にダウンロードされたかどうかはあくまでもブラウザ側の話だと思いますが、
phpでそのあたりの制御をしているのですか?
phpはあくまでもファイルを読み込んで出力しているだけだと思いますが…

通常ファイルのダウンロードを行うような場合は、
ダウンロード用のphpファイルにパラメタ等でファイルを特定出来る文字列を渡して
ブラウザ標準のファイル保存ダイアログを使用するのが一般的です。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerminak83 [12月25日 19:02]

回答ありがとうございます。

>また、正常にダウンロードされたかどうかはあくまでもブラウザ側の話だと思いますが
その通りだと思います。

>phpでそのあたりの制御をしているのですか?
しておりません。

ご指摘頂いた通りリダイレクトでやってみます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)