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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2553閲覧

PHP で、ストレージ内の画像ファイル、テキストファイルをダウンロード

sirius5

総合スコア6

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/01/19 02:32

下記のようなPHPスクリプトにおいて、detail.php からzipfile.phpを、formタグのactionで
指定して、detail.phpの、「ここ」ボタンをクリックして、hidden属性で渡したファイル名のファイルをダウンロードさせたいのですが、ダウンロードファイルのサイズが、0KB で空なのです。どこが間違っているのか教えていただきいです。

「detail.php側」

<!DOCYTPE html> <html> <head><title>画像ファイル詳細画面</title></head> <body> <table width="1000" rows="1" cols="30" border="1" bordercolor="#FFFFFF" bgcolor="lightgreen"> <tr><td align="right"><a href="storage.php">一覧表示</a>&nbsp;&nbsp;<a href="upload.php">アップロード</a></td></tr></table> <br> <table width="1000! rows="2" cols="30" border="1" bordercolor="#FFFFFF" bgcolor="lightgreen"> <?php $user = $_SERVER['REDIRECT_REMOTE_USER']; // .htaccessで認証されたユーザー名

$filename = $_GET['filename'];
$type = $_GET['type'];

$dir = './'.$user.'/';

$filename2=$dir.$filename;
$filename4 = $filename; // 退避
if($type==="画像属性詳細" || $type==="文書"){
$fp = fopen($filename2, 'r');
$buf = fgets($fp);

$title = strtok($buf, ','); $date = strtok(','); $sender = strtok(','); $syurui = strtok(',');

// $filename = strtok(',');
strtok(','); // ファイル名読み飛ばし
$size = strtok(',');
$size=round(filesize($filename2)/1024, 2);
// $type = strtok(',');
$type = mime_content_type($filename2);
strtok(','); // mimeの分を読み飛ばし
$setsumei = strtok(',');
fclose($fp);
}elseif($type==="画像ファイル本体"){
// $filename4 = $filename;
$base = substr($filename, 0, strlen($filename)-4);
$filename3 = $dir.$base.".txt";
$fp = fopen($filename2, 'rb'); // バイナリモード
$img = fread($fp, 51200000); // 最大5MBまで読み込む
fclose($fp);

$fp = fopen($filename3, 'r'); $buf = fgets($fp); $title = strtok($buf, ','); $date = strtok(','); $sender = strtok(','); $syurui = strtok(',');

// $syurui = "画像ファイル本体";
$size= round(filesize($dir.$filename4)/1024, 2);
$type = mime_content_type($dir.$filename4); // 引数はパス(ファイル名ではない)
strtok(','); // ファイル名の分を読み飛ばし
strtok(','); // ファイルサイズの分を読み飛ばし
strtok(','); // mimeタイプの分を読み飛ばし
$setsumei = strtok(',');
fclose($fp);
}

?>

<tr><td>タイトル</td><td><?php echo $title;?></td></tr> <tr><td>登録日時</td><td><?php echo $date;?></td></tr> <tr><td>登録者</td><td><?php echo $sender;?></td></tr> <tr><td>種別</td><td><?php echo $syurui;?></td></tr> <tr><td>ファイル名</td><td><?php echo $filename;?></td></tr> <tr><td>サイズ</td><td><?php echo $size;?>KB</td></tr> <tr><td>タイプ</td><td><?php echo $type;?></td></tr> <tr><td>説明</td><td><?php echo $setsumei;?></td></tr> <?php //echo '<tr><td>ダウンロード</td><td><a href="zipfile.php?zip_filename='.$filename4.'">ここ</a>をクリックしてください</td></tr>'; echo '<form name="form1" method="POST" action="zipfile.php">'; echo '<input type="hidden" name="filename" value="'.$filename4.'">'; echo '<tr><td>ダウンロード</td><td><input type="submit" value="ここ">をクリックしてください</td></tr>'; echo '</form>'; ?> </table> </body> </html> ------------------------------------------------------------------------------- 「zipfile.php側」 <?php //echo 'in zip';

$user = $_SERVER['REDIRECT_REMOTE_USER']; // .htaccessで認証されたユーザー名

mb_internal_encoding("UTF-8");
$ftp = ftp_connect("~");
ftp_login($ftp, "~", "~");

$dir = '/storage2/'.$user;
ftp_chdir($ftp, $dir); // ディレクトリ移動

// Zipクラスロード
$zip = new ZipArchive();

// Zipファイル名
$zipFileName = $_POST['filename'];
//var_dump($zipFileName);

// Zipファイル一時保存ディレクトリ
$zipTmpDir = '/storage2/zip';

$zip->addFile($zipTmpDir.$zipFileName); // ZIPアーカイブにファイルを追加

// Zipファイルオープン
$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($result !== true) {
// 失敗した時の処理
echo '圧縮ファイルをオープンできませんでした';
exit();
}

// ここでDB等から画像イメージ配列を取ってくる
ftp_get($ftp, $zipFileName, $zipTmpDir.$zipFileName, FTP_BINARY ); // 自前サーバーに取得
$image_data_array = array();
array_unshift($image_data_array, $zipTmpDir.$zipFileName);
ftp_close($ftp);

// 処理制限時間を外す
set_time_limit(0);

foreach ($image_data_array as $filepath) {
$filename = basename($filepath);
// 取得ファイルをZipに追加していく
$zip->addFromString($filename,file_get_contents($filepath));
}

$zip->close();

// ストリームに出力
header('Content-Type: application/zip; name="'.$zipFileName.'"');
header('Content-Disposition: attachment; filename="'.$zipFileName.'"');
header('Content-Length: '.filesize($zipTmpDir.$zipFileName));
echo file_get_contents($zipTmpDir.$zipFileName);

// 一時ファイルを削除しておく
unlink($zipTmpDir.$zipFileName);

?>

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

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

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

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

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

guest

回答2

0

では、error_logして、エラーログに吐いてみては?

投稿2015/01/19 12:55

matsubokkuri

総合スコア744

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

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

0

ちょっと、環境依存なコードが多いのでアドバイスをします。

echo file_get_contents($zipTmpDir.$zipFileName);

の後で、

lang

1print filesize($zipTmpDir.$zipFileName); 2exit;

とかやってみて、ファイルは存在することは確認されましたか?

投稿2015/01/19 12:39

matsubokkuri

総合スコア744

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

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

sirius5

2015/01/19 12:54

ご回答有難うございます。ちなみに、print filesize($zipTmpDir.$zipFileName); exit; 入れましたが、detail.phpから、zipfile.phpにリダイレクトしてないので、 表示されません。フォームタグのアクションで設定しているのに、どうしてリダイレクト しないのか、不明な状態です。
matsubokkuri

2015/01/19 12:56

では、error_logして、エラーログに吐いてみては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問