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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2259閲覧

【laravel】ZipArchiveを使ってアップロード時にファイルをまとめたい

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/08/29 04:34

編集2017/08/29 05:42

解決したいこと

いつもありがとうございます。

複数のファイルを選択し、submitした際にそれらをzipでまとめてアップロードさせようとしていますが、アップロードができておりません。

下記コードのうち誤っている箇所、追記すべき内容がありましたらご教授いただけないでしょうか?

php

1 2public function uploadfile() { 3$files = $_FILES['file']['name']; 4 5$zip = new ZipArchive(); 6$fileName = 'a'.'.zip'; 7 8$filePath = storage_path().'\\app\\public\\history\\'.$fileName; 9$res = $zip->open($filePath, ZipArchive::CREATE); 10if ($res === true) { 11 foreach ($files as $file) { 12 $zip->addFile($file); 13 } 14 $zip->close(); 15} else { 16 echo 'エラーが発生しています。'.$res; 17} 18}

html

1<form method="POST" action="{{url('')}}" enctype="multipart/form-data"> 2<input type="file" name="file[]" multiple="multiple"> 3<button type="submit">送信</button> 4</form>

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

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

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

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

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

m.ts10806

2017/08/29 05:39

念のためVIEWのform部分のHTMLもご提示願います。「複数ファイル選択」自体ができるHTMLになっているかどうかこれでは分からないので。
退会済みユーザー

退会済みユーザー

2017/08/29 05:42

ご回答ありがとうございます。htmlの箇所を追記いたしました。ご参照いただければ幸いです。
guest

回答2

0

見た感じ、ファイルアップロードの処理自体が書かれていません。
$_FILESはテンポラリとしてファイルの実体を送信はしますが、PHPで受け取ってサーバーの任意のディレクトリに配置する処理が必要なはずです。

Laravelとのことで、Laravelの形式に則ったやり方があるようなので、下記も参考にしてください。

submitした際にそれらをzipでまとめてアップロード

上記を踏まえた上で以下のような手順となると思います。

  1. ファイルをサーバー内の任意の一時ディレクトリにアップロードの処理
  2. 一時ディレクトリ内のファイルをZipArchive()で圧縮し、zipを置きたい場所に移動
  3. 一時ディレクトリ内のファイルを削除

アップロード自体はファイルのみで圧縮はサーバー側内で行われる処理です。

投稿2017/08/29 05:38

m.ts10806

総合スコア80850

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

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

0

ベストアンサー

とりあえず動く形であれば、以下の形に修正するとZIPを保存できました。
$zip->addFileの第二引数で、圧縮ファイル内でのファイル名を設定できます。

routes/web.php

Route::get('/upload_test', function () { return view("upload_test"); }); Route::post('/upload_test', function () { $files = $_FILES['file']['tmp_name']; $zip = new ZipArchive(); $fileName = 'a'.'.zip'; $filePath = storage_path("app/public/history/{$fileName}"); $res = $zip->open($filePath, ZipArchive::CREATE); if ($res === true) { foreach ($files as $file) { $zip->addFile($file,"file.jpg"); #テストとしてjpg画像で想定 } $zip->close(); } else { echo 'エラーが発生しています。'.$res; } return "ok"; });

resources/views/upload_test.blade.php

<!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <p>upload test</p> <form method="POST" action="{{url("upload_test")}}" enctype="multipart/form-data"> {{csrf_field()}} <input type="file" name="file[]" multiple="multiple"> <button type="submit">送信</button> </form> </body> </html>

きちんとしたファイル保存と圧縮処理を作る場合は、mts10806さんのリンク先等を参照してください。

投稿2017/08/29 06:04

編集2017/08/29 06:10
aro10

総合スコア4106

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

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

退会済みユーザー

退会済みユーザー

2017/08/29 06:19

ご回答ありがとうございます。 ただ、私の方で下記のように修正しましたが、なぜかzipの保存ができません。 どこが誤っていますでしょうか? $files = $_FILES['file']['name']; $zip = new ZipArchive(); $fileName = 'a'.'.zip'; $filePath = storage_path("app\\public\\history\\{$fileName}"); $res = $zip->open($filePath, ZipArchive::CREATE); if ($res === true) { foreach ($files as $file) { $zip->addFile($file); } $zip->close(); } else { echo 'エラーが発生しています。'.$res; }
aro10

2017/08/29 06:30 編集

$files = $_FILES['file']['name'];の部分を回答のコードのようにしてください 。 動くものは$_FILES['file']['tmp_name']です。 ZipArchive::addFileのマニュアルをみると、第一引数はファイルパスです。 http://php.net/manual/ja/ziparchive.addfile.php コメントのコードでstorage_path内でバックスラッシュを使っているのは、windows利用の都合と想定します。
退会済みユーザー

退会済みユーザー

2017/08/29 06:29

ありがとうございます。 zipの作成はできましたが、中身にファイルがまったくありませんでした。
aro10

2017/08/29 06:33

$zip->addFile($file);がうまくいってないのではないのでしょうか。開発環境の問題等の詳細がわからないのでひとまず回答で示したサンプルのコードをそのまま動かしてみて動くかどうか試してみてください(jpeg画像アップロードでテストしています)。
退会済みユーザー

退会済みユーザー

2017/08/29 07:29

ありがとうございます。ご指摘の通り、$zip->addFile($file)の$fileにてファイル名を指しているからでした。 ファイルパスに変更したところ、ファイル名は表示されましたが、中身が表示されないままでした。
aro10

2017/08/29 07:31

「ファイル名は表示されましたが、中身が表示されない」とはどういう状態ですか?ZIPファイルを解凍をすれば中身のファイルは存在するが開けない(破損している)といった事でしょうか
退会済みユーザー

退会済みユーザー

2017/08/29 08:15

失礼いたしました。 中身のファイルは存在するが破損している状態になります。
aro10

2017/08/29 08:20 編集

こちらの環境(Mac、PHP7.1ビルトインサーバー)では回答のサンプルプログラムでアップロードしてjpgをZIP圧縮で保存した場合は、解凍してそのまま閲覧できたのでPHPの実行環境や設定等の問題かもしれません。 ひとまず一度PHPでのファイルアップロードと保存ができるようになってから、ZIP圧縮に挑むと解決するかと思います。
退会済みユーザー

退会済みユーザー

2017/08/29 08:46

かしこまりました。 たとえば3枚をzipで圧縮しようとしても1枚しか表示されないのですが、こちらが関係していることはないでしょうか?
aro10

2017/08/29 09:05 編集

回答に、$zip->addFile($file); の第二引数の説明を書いていますが、指定していないと上書きされるかと思います。回答の内容が伝わっていない部分があるので、各種内容を理解してから手を動かした方が作業が速いと思います。
退会済みユーザー

退会済みユーザー

2017/08/29 11:17

質問ばかりで失礼いたしました。 一度同様の構造にしてから、解剖していこうと思い、構造を同じにしたはずなのですが、今度はどうしてかzipが出力されなくなってしまいました。ただ、returnではokが返ってきます。 恐れ入りますが、私のxamppなどに問題があるのでしょうか? $files = $_FILES['file']['tmp_name']; // インスタンスの生成 $zip = new ZipArchive(); $fileName = 'a'.'.zip'; $filePath = storage_path("app\\public\\history\\{$fileName}"); $res = $zip->open($filePath, ZipArchive::CREATE); if ($res === true) { foreach ($files as $file) { $zip->addFile($filePath, "a.jpg"); } $zip->close(); } else { echo 'エラーが発生しています。'.$res; } return "ok";
aro10

2017/08/29 11:35

コンソールコマンドで確認した所、addFileで何も追加できない状態の空ファイルだとzipファイルは作成されないようです。 #base_pathにtest.txtがある状態 Artisan::command('zip_test', function () { $filePath = base_path("test.zip"); $zip = new ZipArchive(); $zip->open($filePath, ZipArchive::CREATE); $zip->addFile(base_path("test.txt")); #データ追加されるとtest.zipは作成される #$zip->addFile(base_path("no_file.txt")); #データ追加できないとtest.zipは作成されない $zip->close(); });
退会済みユーザー

退会済みユーザー

2017/08/29 11:56

ご確認いただきまして、誠にありがとうございます。 addFileの第二引数を$_FILES['file']['name'][$i]で対応したところ、zipファイル内のファイルに元の名前を付けることができました。 ありがとうございます。
aro10

2017/08/29 12:15 編集

よかったです。 あと質問は解決したものは閉じていった方が良いかと思います。解決していないものは問題を整理して質問を追加等をしてください
退会済みユーザー

退会済みユーザー

2017/08/30 02:22

質問の件かしこまりました。結局わからず放置してしまっているものがありますので、整理してから質問しなおしたいと思います。 また、おかげさまで私が行いたいことを行うことができました。先にmts様のご回答をある種ちゃんとしたとおっしゃっていましたが、aro様のとはどういった点で異なりうるでしょうか? 特定の名前を付け、ファイルが保存できる点で同じものと思われますので・・・
aro10

2017/08/30 04:54

きちんとした処理というのは、$_FILE剥き出しのコードを書くよりも、 Laravelのアップロードファイルを処理する機能を使うとコードがより修正しやすい形で簡潔にかけたり、 Laravelのファイルや画像のバリデーションを必要に応じて使うといった感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問