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

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

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

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

Q&A

2回答

6593閲覧

DBにバイナリとして格納したEXCELをPHPでダウンロードしたい

pokute105

総合スコア6

PHP

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

0グッド

2クリップ

投稿2018/08/02 03:02

編集2018/08/02 05:35

実現したいことは、標題の通りです。
DBはSQLSERVER2015を使用しており、
バイナリデータはvarbinary(MAX)で格納しています。

現在実現できていることは、
PHPからDBへの接続
バイナリデータの取得
コンテンツタイプをExcelに設定
ファイルのダウンロード処理

問題点
Excelファイルはダウンロードされますが、
開く際、Excelでは開けませんとエラーがでます。
ダウンロードしたファイルをテキストエディタで開いたところ、
PHPのソースコードが記載されていました。

質問
格納したExcelファイルをダウンロードするには、どうすればよいのでしょうか。
PHPを初めて2日目になります。ずっと方法を探しているのですが、中々前へ進めません。ご教示のほどよろしくお願いいたします。

ソースコード

PHP

1<?php 2 require_once(dirname(__FILE__) . '/../common/config.php'); 3 4 //データベースのインスタンス名を指定 5 $serverName = config::DB_SERVER_NAME; 6 //接続情報を指定 7 $connectionInfo = array("UID"=>config::DB_USER_ID, 8 "PWD"=>config::DB_PASSWORD, 9 "Database"=>config::DB_NAME, 10 "CharacterSet"=>"UTF-8"); 11 //コネクションを確立 12 $conn = sqlsrv_connect($serverName, $connectionInfo); 13 14 $sql = 'SELECT IMAGE FROM EXCEL_DLL WHERE DIVISION = 1'; 15 16 //クエリーを実行 17 $result = sqlsrv_query($conn, $sql); 18 $row = sqlsrv_fetch_array($result) ; 19 20 $filename = 'TEST.xlsm'; 21 header('Content-type: application/vnd.ms-excel'); 22 header('Content-Disposition: attachment; filename="'.$filename.'"'); 23 24 //2018-08-02 14:10 修正 25 //file_get_contents($row['IMAGE_NM']); 26 echo $row['IMAGE_NM']; 27 28 //クエリー結果の開放 29 sqlsrv_free_stmt($result); 30 //コネクションのクローズ 31 sqlsrv_close($conn); 32?>

追記 2018/08/02
上記修正後の実行結果
イメージ説明

テーブル作成時のSQL文

SQl

1CREATE TABLE EXCEL_DLL(DIVISION varchar(2), IMAGE_NM varbinary(max),VERSION varchar(10),UPDATE_DT datetime) 2INSERT INTO EXCEL_DLL(DIVISION,IMAGE_NM,VERSION,UPDATE_DT) 3SELECT '1',img.BulkColumn,'1.0',sysdatetime() 4FROM (SELECT * FROM OPENROWSET(BULK N'C:\Test.xlsm',SINGLE_BLOB) AS i ) img

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

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

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

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

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

guest

回答2

0

echo ではなくて、

php

1$fp = fopen('php://output', 'w'); 2fwrite($fp, $row['IMAGE_NM']); 3fflush($fp); 4fclose($fp);

だとどうでしょうか。

投稿2018/08/02 05:59

tacsheaven

総合スコア13703

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

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

0

<?phpから始まるソースコードがダウンロードされているのであればPHPが実行されてない可能性が高いです。 またどのようにバイナリ格納されているかわからないですが `echo file_get_contents($row['IMAGE_NM']);` か `echo $row['IMAGE_NM'];` としてあげる必要があるのでは無いでしょうか。

投稿2018/08/02 04:52

編集2018/08/02 04:54
namda

総合スコア705

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

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

pokute105

2018/08/02 05:31

namba様、回答ありがとうございます。ご指摘頂いたコードを修正したところ、PHPのコードではなく、バイナリ?が記載されるようになりました。 ですが、格納したExcelを開くことは出来ません。 開いた時のエラーメッセージ、テキストエディタで開いた画面 テーブルを作った際のSQL文を追記します。 何卒、よろしくお願いいたします。
namda

2018/08/02 06:23 編集

先頭行見る感じちゃんとエクセルデータみたいですね。 おそらくゴミデータが混ざって読めなくなってると思います。 最後の ?>を消して試してみてください。 また、 echo $row['IMAGE_NM']; のところを $tmppath= sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'text.xmls'; file_put_contents($tmppath, $row['IMAGE_NM'];); echo $tmppath; として出力されたパスにできたエクセルをファイルを開けるか確かめみてください。 それで開けてPHPでDLしたものが開けないようでしたら 別なかたが回答している`fwrite`する方法もをためしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問