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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

3047閲覧

PHPで複数のファイルをzip圧縮しダウンロードする方法

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

1クリップ

投稿2021/07/28 20:20

編集2021/07/29 03:44

前提・実現したいこと

PHPでサーバーにアップしている複数のファイルをzipに圧縮してダウンロード出来るようにしたいです。

発生している問題・エラーメッセージ

**追記**************** ファイルパスの中にすでにファイル名が含まれているのに、zipにファイルを追加する際さらにファイル名をaddしてファイル名が二重になっていました。 なのでこのコードを $zip->addFile($filepath.$filename,$filename); ↓ これに直しました $zip->addFile($filepath,$filename); またファイルパスも絶対パスに戻しました。 この修正でzipファイルの作成は成功したんですが、ダウンロードに失敗します。 ダウンロード中にsafariブラウザにthe operation couldn't be completedというメッセージが表示されストップします。Reloadボタンを押しダウンロードを再開するとDecompression failedと表示されダウンロードに失敗し解凍することもできません。 ファイルマネージャーでサーバーから直接圧縮されたzipをダウンロードすると普通に解凍できました。 **ここまで追記****************** zipをダウンロードすると壊れていて解凍することができません。圧縮するファイル数を変えても必ずzipのファイルサイズが17KBなので、もしかしたらファイルを追加出来ていないのかもしれません。ファイルパスが間違っていると思い何度も修正したのですが結果は変わらずでした。

該当のソースコード

PHP

1<?php 2// Zipクラスロード 3$zip = new ZipArchive(); 4// Zipファイル名 5$zipFileName = get_the_ID() . '.zip'; 6// Zipファイル一時保存ディレクトリ 7$zipTmpDir = dirname(__FILE__) ."/../../../../uploads/zip"; 8 9// Zipファイルを新規作成、または存在すれば上書きで開く 10$zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 11 12// 処理制限時間を外す 13set_time_limit(0); 14 15// zipにファイルを追加 16foreach ($urls as $url) { 17 // ファイルURLからファイル名とフォルダ名を取得 18 $filename = basename($url); 19 $filenamenum = mb_strlen($filename) + 9; 20 //ファイル名とフォルダ名からファイルパスを取得 21 $filepath = dirname(__FILE__) ."/../../../../uploads" . mb_substr("$url", -$filenamenum); 22 23 // 取得ファイルをZipに追加していく 24 $zip->addFile($filepath.$filename,$filename); 25} 26$zip->close(); 27 28// Zip圧縮したファイルをダウンロード 29mb_output_handler("pass"); 30// ファイルタイプを指定 31header('Content-Type: application/zip; name="' . $zipFileName . '"'); 32// ファイルのダウンロード、リネームを指示 33header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); 34// ファイルサイズを取得し、ダウンロードの進捗を表示 35header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); 36mb_http_output( "pass" ) ; 37// ファイルを出力する前に、バッファの内容をクリア(ファイルの破損防止) 38ob_end_clean(); 39readfile($zipTmpDir.$zipFileName); 40 41 42// 一時ファイルを削除しておく 43unlink($zipTmpDir.$zipFileName); 44exit();

試したこと

-ファイルパスを変更
このファイルパスから
/home/folder/folder/folder/folder/uploads

このファイルパスに変更しました
dirname(FILE) ."/../../../../uploads"

上記のパスの最後にファイルURLから取ったファイル名とファイルごとに異なるフォルダ名を追加してファイルパスとして使用しています。

-zipファイルの破損防止のために下記のコードを追加
mb_output_handler("pass");
mb_http_output( "pass" ) ;
ob_end_clean();

-圧縮ファイルの変更
上記のパスの記述方法が正しくないのかと思い、このphpファイルと同じフォルダにtxtファイルを配置しシンプルなパスに変更し、それをzipに追加してダウンロードしてみたのですが変わらず17KBで解凍できませんでした。

補足情報(FW/ツールのバージョンなど)

phpのバージョン: 7.4.14

phpのzipのバージョン
Zip enabled
Zip version 1.15.6
Libzip headers version 1.3.2
Libzip library version 1.3.2

使用しているサーバー: Conoha Wing

使用しているEditer: Adobe Dreamweaver

Wordpressでサイトを作っています

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/29 00:06

zipファイルのダウンロード自体はできていて、ファイルが破損していて読めないということでしょうか? バイナリエディタなどを駆使してzipファイルの冒頭に含まれるデータを確認してみてはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2021/07/29 01:39

zipファイルのダウンロードはできているんですが、ファイルが破損しているのか解凍できない状態です。また圧縮するファイル数を変えてもzipのサイズは全て同じで17KBです。 バイナリエディタで調べてみました。readfileとunlinkの所でzipファイルが見つからないとWarningがでていました。パスを間違えているのか記述方法を間違えているのかもしれません。そこら周りをもう少し調べてみます。アドバイスありがとうございます!
guest

回答1

0

ベストアンサー

自己解決できました。
単純にファイルパスのミスとダウンロードのコード周りのミスでした。

ダウンロードの正しい設定は下記のサイトを参考にさせていただきました。
【PHP】正しいダウンロード処理の書き方
https://qiita.com/fallout/items/3682e529d189693109eb

m6uさん
バイナリエディタでどこが間違えているか気づくことが出来ました!ありがとうございました!

投稿2021/07/29 05:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問