【php】選択したファイルをzipにまとめてダウンロードさせる方法

Programming

今回の記事では、phpを使用して、チェックボックスで選択したファイル(PDF等)をzipにまとめてダウンロードさせる方法を紹介します。さらに今回の方法はPDFを簡単にアップロード出来る管理画面付きです。

ホワイトペーパーページや、資料ダウンロードページなどでよく見られる仕様なので覚えて貰えればいつか役に立つかと思います。

選択したファイルをzipにまとめてダウンロードさせる方法(準備)

まず前提条件として今回の方法は、WordPressを使用します。

初めに準備として、カスタム投稿とカスタムフィールドを作成します。

カスタム投稿機能はCustom Post Type UIを使用すれば簡単に設定出来ます。カスタムフィールドはAdvanced Custom Fieldsを使用すれば簡単に設定出来ます。

今回はカスタム投稿タイプの「document」という名前で作成しました。この投稿で必要な機能は「タイトル」と「アイキャッチ」と次で作成する「カスタムフィールド」のみです。その他はOFFでOKです。

カスタムフィールドは「file」という名前で作成しています。

【*重要】カスタムフィールドの返り値は必ず「ファイルのURL」にしといて下さい。

作成した「document」の投稿機能にいくつかテスト投稿をしてみて下さい。正常に投稿されてページが表示されればOKです。

選択したファイルをzipにまとめてダウンロードさせる方法(phpコード)

phpファイルでダウンロードページのフォームを作成していきます。
ループを使って先程作成したカスタムフィールド付きの投稿をループ表示させています。

以下に重要な部分だけまとめておきます

  • 1行目。formタグのactionで次で紹介するzip.phpを読み込んでください。
  • 5行目。カスタム投稿とフィールドを呼び出してます。こうすることでWP管理画面から追加が可能に。
  • 25行目。inputタグの中のnameはpdfでは無くpdf[]にして下さい。出ないと配列として認識されない。
  • 25行目。inputタグの中のvalueはカスタムフィールドの返り値にして下さい。今回は$fileにまとめています。この件が返り値をURLにしなくてはいけない理由です。ただこうする場合はサイト内を右クリックできない様にする事をお勧めします。
<form method="post" action="<?php echo get_template_directory_uri(); ?>/zip.php">
<ul>
<?php
// カスタム投稿
$information= get_posts( array (
'numberposts' => 3, 'orderby',
'post_type' => array('document'), 
));
if( $information):
?>
<?php
foreach( $information as $post ):
setup_postdata( $post ); 
?>
<?php //カスタムフィールド
$file = get_field('file'); ?>
<div>
<label>
<li>
<span><?php the_title(); ?></span>
<input type="checkbox" class="checkbox-input" id="<?php echo $file;?>" name="pdf[]" value="<?php echo $file;?>" />
</li>
<!-- サムネイル -->
<div>
<?php if ( has_post_thumbnail() ): ?>
<img src="<?php the_post_thumbnail_url(); ?>">
<?php else: ?>
<img src="ここに代替画像のURL">
<?php endif; ?>
</label>
</div>
</div>
<?php endforeach; wp_reset_postdata(); ?>
<?php else: ?>
<p>表示できる情報はありません。</p>
<?php endif; ?>
</ul>
<p>
<input type="submit" value="ダウンロード" /> <input type="reset" value="リセット" />
</p>
</form>

次にzip.phpを作成して、以下のコードを記述します。

以下に重要な部分だけまとめておきます

  • 3行目。$_POSTの[]の中は先程のinputタグのnameの値と同じにして下さい。ただし[]はいらないです。
  • 16行目。後ほどtmpのファイルを作成します。
<?php
 
	if (!empty($_POST["pdf"])){
	// ダウンロードさせたいファイル
	$pdf= $_POST['pdf'];
	$pathAry = array();
	for($i=0; $i<sizeof($pdf); $i++){
    $pathAry[] = $pdf[$i];
    }
	
	// zipのインスタンス作成
	$objzip = new zipArchive($pathAry);
	
	// 一時ファイル(zip)の名前とPath
	$zipName = "file_".date("Ymds") .'.zip';
	$zipPath = 'tmp/'.$zipName;
	
	// 一時ファイル(zipファイル)を作成
	$result = $objzip->open($zipPath, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
	if ($result !== true) {
		echo "err - open zip-file";
		exit;
	}
	
	set_time_limit(0);
	
	// zipに追加
	foreach ($pathAry as $filepath) {
		$filename = basename($filepath);
		$objzip->addFromString($filename, file_get_contents($filepath));
	}
	$objzip->close();
	
	// 出力(ダウンロード)
	header('Content-Type: application/zip; name="' . $zipName . '"');
	header('Content-Disposition: attachment; filename="' . $zipName . '"');
	header('Content-Length: '.filesize($zipPath));
	echo file_get_contents($zipPath);
	
	// 一時ファイル(zipファイル)の削除
	unlink($zipPath);
	exit();
	
	}else{
	header("Location:index.html");
	}
?>

最後にzipを一時的に保存するファイルを作成します。

先程、重要な部分で書いた様に「tmp」というファイルを作成する必要があります。ファイルのディレクトリはzip.phpがある場所と同じです。

このファイルは、一時的にzipにしたファイルを置く場所ですので、ファイルの中身には何も入れなくて大丈夫です。しかしこのファイルがないと上記のphpは機能しないので必ず用意して下さい。

(ここで紹介したzip.phpはWordPressでも無くても問題なく動作します。)


以上が「【php】選択したファイルをzipにまとめてダウンロードさせる方法」でした。

個人的な技術メモ的な記事にですが、誰かの役に立場幸いです。また、何か違う部分があればコメントにてご教授下さい。

この記事を書いた人
KEITO

AI × IT × WEB3|関東在住。本職はディレクター 。AIを活用してビジネス開拓。仕事の依頼はTwitterからお願いします。YouTube、Twitter、Instagramもお願い致します。

Programming
この記事を共有する
スポンサーリンク
スポンサーリンク
KT LIFE
スポンサーリンク

暗号資産投資するなら以下

Bybit

国内人気No.1!屈強なサーバー/信頼性抜群!トレーダー御用達の取引所。

通貨数338種以上
レバレッジ最大100倍
現物取引手数料Maker:0%〜0.1%
Taker:0.02%〜0.1%
先物取引手数料Maker:0%〜0.01%
Taker:0.03%〜0.06%
操作性スマホでも取引・入金できる
口座開設簡単に口座開設できる
日本語対応日本語対応あり・JPY利用可
特典下記から登録で初回ボーナスあり
登録リンクBybitへの登録は こちら
招待コード22295
レビュー記事レビュー記事は こちら
BigBoss&CRYPTOS

最大レバレッジ1111倍・日本円換金ルート

通貨数BigBoss:15種以上
CRYPTOS:15種以上
レバレッジ最大1111倍
スポット手数料Maker:0.02%〜0.18%
Taker:0.05〜0.20%
先物取引手数料
操作性スマホでも取引・入金できる
口座開設少し敷居が高い
日本語対応日本語対応あり
特典下記から登録で初回ボーナスあり
登録リンクBigBossへの登録は こちら
招待コード6690951
レビュー記事レビュー記事は こちら
Nexo

高APYでのステーキング&レンディング

通貨数60種以上
レバレッジ
スポット手数料Maker:0.04%〜0.20%
Taker:0.03%〜0.20%
先物取引手数料
操作性スマホでも取引・入金できる
口座開設簡単に口座開設できる
日本語対応日本語対応あり
特典下記から登録で初回ボーナスあり
登録リンクNexoへの登録は こちら
招待コード
レビュー記事レビュー記事は こちら

他おすすめ取引所はこちら

タイトルとURLをコピーしました