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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

解決済

2回答

4113閲覧

「unzip」コマンドを使った解凍処理について

zawa_57

総合スコア6

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

4クリップ

投稿2020/01/30 07:29

前提・実現したいこと

PHPで製品データ(プログラムやマニュアル等)をアップロードして、管理するシステムを作成しております。
アップロードする際には、事前に製品データを纏めてZIP化にしております。
その後にアップロードしたファイルをダウンロードするという機能を作成しております。
ならびに、製品データのマニュアルのみをダウンロードするという機能を実装中で、ZIPファイルをサーバー上で解凍するという処理を作成中に
以下のエラーメッセージが発生致しました。

ZIPファイルの中身
あいうえお.pdf
かきくけこ.pdf

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

実行結果:2 /var/www/html/forCustomer/license/test2.php:10: array (size=7) 0 => string 'Archive: /tmp/テスト.zip' (length=22) 1 => string 'checkdir error: cannot create /tmp/???.zip' (length=43) 2 => string ' Invalid or incomplete multibyte or wide character' (length=66) 3 => string ' unable to process ???/?????.pdf' (length=48) 4 => string 'checkdir error: cannot create /tmp/???.zip' (length=43) 5 => string ' Invalid or incomplete multibyte or wide character' (length=66) 6 => string ' unable to process ???/?????.pdf'

該当のソースコード

PHP

1$path = /tmp/; //解凍するフォルダ名までの絶対パス 2$file = /tmp/テスト.zip; //解凍するファイル名までの絶対パス 3 4//unzipコマンドを使った解凍処理 5$cmd = "unzip -O sjis " . $file . " -d " . $path ." 2>&1"; 6exec($cmd, $opt, $return_ver); 7echo '実行結果:'.$return_ver; 8var_dump($opt);

試したこと

エンコードが原因ですので、「sjis」から「CP932」に変更しましたが変わりませんでした。
Linuxサーバーで直接コマンド入力した結果、文字化けも起こらず日本語表記になっていました。
PHPコードからですと、文字化けになってしまいます。
お手数をおかけいたしますが、ご教授お願い致します。

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

PHP 7.2.26
CentOS 7.7.1908

文字化けが起こらずに解凍できるという「unar」というコマンドがありますが、CentOSに配布されていないようで色々なサイトから
インストール方法を調べましたが、なかなか見つかりませんでした。
CentOSで「unar」のインストール方法を知っている方がいれば、こちらもご教授いただければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Linuxサーバーで直接コマンド入力した結果、文字化けも起こらず日本語表記になっていました。

ということであれば、

PHP

1$cmd = "LC_ALL=ja_JP.UTF-8 unzip -O sjis " . $file . " -d " . $path ." 2>&1";

にしてみてください。

投稿2020/01/30 07:56

otn

総合スコア84503

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

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

zawa_57

2020/01/30 09:16

早急な回答ありがとうございます。 早速試してみましたところ、文字化けが起こらず、日本語表記で表示されました。 『LC_ALL=ja_JP.UTF-8』が大事だったんですね、盲点でした。 ご教授下さり誠にありがとうございます。 今後とも学習に励んでいこうと思います。
otn

2020/01/30 09:42

盲点というか、ログインしてのコマンドラインと、ウェブサーバーが起動するPHPの環境の違いに原因があるのは明らかです。
guest

0

Invalid or incomplete multibyte or wide character' (length=66)

とあるので、zipされるファイル名や xxxxxx.zip に日本語を使わない半角英数字だけのファイル名で試されては?

投稿2020/01/30 07:38

Orlofsky

総合スコア16415

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

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

zawa_57

2020/01/30 09:22

回答ありがとうございます。 私も本当は半角英数字のみで構成をしたいのですが、日本語を使ったファイル名でないといけませんので...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問